tubo

2015-07-04 19 views
6

Secondo Elixir Tutorial on Enumerables and Streams:tubo

Il |> simbolo è l'operatore di pipe: prende semplicemente l'uscita dall'espressione sul suo lato sinistro e lo passa come ingresso alla chiamata di funzione alla sua destra lato.

Tutte le funzioni del modulo Enum sono impazienti.

Quindi qual è la differenza nelle seguenti dichiarazioni? Perché l'ultimo restituisce un risultato diverso?

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] 

risposta

6

Argomenti per i metodi prima di un operatore tubo devono essere in parentesi.

Tutti questi sono equivalenti:

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] 

Tranne questo:

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

Qui, elisir prima calcola il metodo Enum.take/2 con 1..1_0000 e come argomenti e quindi chiama Enum.reverse/1 sul risultato.

# 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

Sì, ho dimenticato la precedenza degli operatori http://elixir-lang.org/docs/stable/elixir/Kernel.html#|%3E/2 – lad2025