2015-07-04 99 views
6

根據Elixir Tutorial on Enumerables and 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] 

回答

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] 

在此,藥劑首先計算Enum.take/2方法與1..1_0000和作爲參數和然後在結果上調用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) 
+2

是的,我忘了運營商的優先順序http://elixir-lang.org/docs/stable/elixir/Kernel.html#|%3E/2 – lad2025