2016-04-23 71 views
3

我必須解析一個xml文檔,從xml節點中提取一個整數。管道中的模式匹配

目前我有:

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

其工作正常,但我不喜歡有搶救的一切,我想這樣做:

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

,但我在得到unhandled operator ->第四行,有沒有辦法做到這一點?

回答

17

您需要管道進入Integer.parse,然後再進入case

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

演示:

iex(1)> MyInteger.parse "123" 
123 
iex(2)> MyInteger.parse "abc" 
nil 

注意MyInteger.parse "123abc" #=> 123,所以你可能想改變你的模式匹配爲{int, ""} -> int,如果你需要和Integer.parse/1一樣的行爲。

+2

只要確保把case表達式放入它自己的函數中。爲了便於閱讀,管道表達式不應超過一行。 – tkowal

+1

@tkowal即使它是最後一行?有時就像在這種情況下,你匹配返回的東西(也許再次管道)或完全退出 – alex88