管道中的模式匹配

ale*_*x88 9 elixir

我要解析一个xml文档,从xml节点中提取一个整数.

目前我有:

try do
  Floki.find(node, "stat[type='jersey_num']")
    |> Floki.text
    |> Integer.parse
    |> elem(0)
rescue
  e -> nil
end
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,但我不喜欢拯救一切,我想做的事情如下:

Floki.find(node, "stat[type='jersey_num']")
  |> Floki.text
  |> case Integer.parse do
    { int, _binary } -> int
    _                -> nil
  end
Run Code Online (Sandbox Code Playgroud)

但我进入unhandled operator ->第四行,有没有办法做到这一点?

Dog*_*ert 26

你需要先管道Integer.parse然后进入case:

defmodule MyInteger do
  def parse(string) do
    string
    |> Integer.parse
    |> case do
         {int, _} -> int
         _ -> nil
       end
  end
end
Run Code Online (Sandbox Code Playgroud)

演示:

iex(1)> MyInteger.parse "123"
123
iex(2)> MyInteger.parse "abc"
nil
Run Code Online (Sandbox Code Playgroud)

请注意,如果您想要MyInteger.parse "123abc" #=> 123与之{int, ""} -> int相同的行为,您可能希望将模式匹配更改为Integer.parse/1.

  • 只需确保将case表达式放入其自己的函数中.为了便于阅读,管道表达式不应超过一行. (2认同)