2015-07-04 12 views
6

Nach Elixir Tutorial on Enumerables and Streams:Rohr Bediener Verhalten

Der |> Symbol ist der Rohrhalter: es einfach die Ausgabe von dem Ausdruck auf der linken Seite nimmt und gibt sie als die Eingabe in den Funktionsaufruf auf seinem rechten Seite.

Alle Funktionen im Enum-Modul sind eifrig.

Was ist der Unterschied in folgenden Aussagen? Warum gibt der letzte ein anderes Ergebnis zurück?

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] 

Antwort

6

Argumente für Verfahren vor einem Rohr Operator in Klammern sein sollte.

Alle diese sind äquivalent:

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] 

Außer diese:

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

Hier berechnet die erste Elixir Enum.take/2 Methode mit 1..1_0000 und als Argumente und ruft dann Enum.reverse/1 auf das Ergebnis.

# 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

Ja, ich habe vergessen, Operator Vorrang http://elixir-lang.org/docs/stable/elixir/Kernel.html#|%3E/2 – lad2025