当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。