2015-07-04 19 views
6

göre Elixir Tutorial on Enumerables and Streams için:Boru operatör davranış

|> sembolü boru operatörüdür: basitçe sol taraftaki ifadeden çıkış alır ve onun sağdaki işlev çağrısına girdi olarak geçirir yan.

Enum modülündeki tüm işlevler istekli.

Aşağıdaki ifadeler arasındaki fark nedir? Sonuncusu neden farklı bir sonuç veriyor? bir boru operatör önceki yöntemlere

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] 

cevap

6

değişkenleri parantez içinde olmalıdır.

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] 

dışında bu:

Burada
Enum.reverse 1..1_0000 |> Enum.take 5 
#=> [5, 4, 3, 2, 1] 

, İksir ilk 1..1_0000 ile Enum.take/2 yöntemi hesaplar

Tüm bu eşdeğerdir argümanlar olarak ve sonuçta Enum.reverse/1'u çağırır.

# 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

Evet, operatör önceliği unuttuk http://elixir-lang.org/docs/stable/elixir/Kernel.html#|%3E/2 – lad2025