管道操作员行为

Luk*_*zda 6 elixir

根据Elixir Enumerables和Streams教程:

|>符号是管道操作符:它只是从左侧的表达式获取输出,并将其作为右侧函数调用的输入传递.

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]
Run Code Online (Sandbox Code Playgroud)

She*_*yar 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]
Run Code Online (Sandbox Code Playgroud)

除此之外:

Enum.reverse 1..1_0000 |> Enum.take 5
#=> [5, 4, 3, 2, 1]
Run Code Online (Sandbox Code Playgroud)

在这里,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)
Run Code Online (Sandbox Code Playgroud)

  • 是的,我忘记了运算符优先级http://elixir-lang.org/docs/stable/elixir/Kernel.html#|%3E/2 (2认同)