管道操作员行为

Pipe operator behaviour

根据Elixir Tutorial on Enumerables and Streams

The |> symbol is the pipe operator: it simply takes the output from the expression on its left side and passes it as the input to the function call on its right side.

All the functions in the Enum module are eager.

那么下面的说法有什么区别呢?为什么最后一个 return 结果不同?

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]

Arguments for methods before a pipe operator should be in parenthesis.

所有这些都是等价的:

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首先计算Enum.take/2方法,参数为1..1_00005然后对结果调用 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)