當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Elixir Kernel.left |> right用法及代碼示例


Elixir語言中 Kernel.left |> right 相關用法介紹如下。

用法:

left |> right
(宏)

管道操作符。

該運算符將左側的表達式作為右側函數調用的第一個參數引入。

例子

iex> [1, [2], 3] |> List.flatten()
[1, 2, 3]

上麵的示例與調用 List.flatten([1, [2], 3]) 相同。

當需要執行一係列類似於管道的操作時,|> 運算符最有用:

iex> [1, [2], 3] |> List.flatten() |> Enum.map(fn x -> x * 2 end)
[2, 4, 6]

在上麵的示例中,列表 [1, [2], 3] 作為第一個參數傳遞給 List.flatten/1 函數,然後扁平列表作為第一個參數傳遞給 Enum.map/2 函數,該函數將列表的每個元素加倍。

換句話說,上麵的表達式簡單地轉換為:

Enum.map(List.flatten([1, [2], 3]), fn x -> x * 2 end)

陷阱

使用管道運算符時有兩個常見的陷阱。

第一個與運算符優先級有關。例如,下麵的表達式:

String.graphemes "Hello" |> Enum.reverse

轉換為:

String.graphemes("Hello" |> Enum.reverse())

這會導致錯誤,因為沒有為二進製文件定義 Enumerable 協議。添加顯式括號可以解決歧義:

String.graphemes("Hello") |> Enum.reverse()

或者,甚至更好:

"Hello" |> String.graphemes() |> Enum.reverse()

第二個限製是 Elixir 總是通過管道傳遞給函數調用。因此,要通過管道連接到匿名函數,您需要調用它:

some_fun = &Regex.replace(~r/l/, &1, "L")
"Hello" |> some_fun.()

或者,您可以使用 then/2 獲得相同的效果:

some_fun = &Regex.replace(~r/l/, &1, "L")
"Hello" |> then(some_fun)

then/2 最常用於當您想要通過管道傳遞到函數但預期值在第一個參數之外的情況下,例如上麵。通過用它的值替換some_fun,我們得到:

"Hello" |> then(&Regex.replace(~r/l/,&1, "L"))

相關用法


注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Kernel.left |> right。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。