根据Elixir Tutorial on Enumerables and Streams:
|> symbol是管道运算符:它只是从左侧的表达式中获取输出,并将其作为右侧函数调用的输入传递。
Enum模块中的所有功能都非常渴望。
那么以下陈述的区别是什么?为什么最后一个会返回不同的结果?
iex(1)> 1..1_000 |> Enum.reverse |> Enum.take 5
[1000, 999, 998, 997, 996]
iex(2)> (Enum.reverse 1..1_000) |> Enum.take 5
[1000, 999, 998, 997, 996]
iex(3)> Enum.reverse 1..1_0000 |> Enum.take 5
[5, 4, 3, 2, 1]
答案 0 :(得分:6)
管道运算符之前的方法的参数应该在括号中。
所有这些都是等价的:
1..1_000 |> Enum.reverse |> Enum.take 5
#=> [1000, 999, 998, 997, 996]
(Enum.reverse 1..1_000) |> Enum.take 5
#=> [1000, 999, 998, 997, 996]
Enum.reverse(1..1_000) |> Enum.take 5
#=> [1000, 999, 998, 997, 996]
除此之外:
Enum.reverse 1..1_0000 |> Enum.take 5
#=> [5, 4, 3, 2, 1]
此处,Elixir首先使用 1..1_0000 和 5 作为参数计算Enum.take/2
方法,然后在结果上调用Enum.reverse/1
。
# It is actually equal to this:
Enum.reverse(1..1_0000 |> Enum.take 5)
# or this if you simplify it:
Enum.reverse(Enum.take(1..1_0000, 5)