Do you want to pick up from where you left of?
Take me there

Operatore Pipe

L’operatore pipe |> inoltra il risultato di un’espressione come primo parametro di un’altra espressione.

Introduzione

La programmazione può diventare caotica. Così caotica che le chiamate alle funzioni possono essere innestate al punto da renderne difficile la comprensione. Consideriamo le seguenti funzioni innestate:

foo(bar(baz(new_function(other_function()))))

In questo caso, stiamo passando il valore other_function/0 a new_function/1, e new_function/1 a baz/1, baz/1 a bar/1, ed infine il risultato di bar/1 a foo/1. Elixir adotta un approccio pragmatico a questo caos sintattico offrendo l’operatore pipe. L’operatore pipe, che viene rappresentato con |> prende il risultato di un’espressione, e la inoltra. Diamo un altro sguardo al pezzo di codice precedente riscritto con l’operatore pipe:

other_function() |> new_function() |> baz() |> bar() |> foo()

Il pipe prende il risultato sulla sinistra, e lo passa al lato destro.

Esempi

In questa serie di esempi, useremo il modulo String di Elixir.

iex> "Elixir rocks" |> String.split()
["Elixir", "rocks"]
iex> "Elixir rocks" |> String.upcase() |> String.split()
["ELIXIR", "ROCKS"]
iex> "elixir" |> String.ends_with?("ixir")
true

Best Practices

Se il numero di parametri accettati da una funzione (arity) è maggiore di 1, assicurati di usare le parentesi. Questo non ha a che fare con Elixir, ma è importante per altri programmatori che potrebbero confondersi con il tuo codice. Se prendiamo il nostro terzo esempio, e rimuoviamo le parentesi da String.ends_with?/2, riceveremo il seguente avviso:

iex> "elixir" |> String.ends_with? "ixir"
warning: parentheses are required when piping into a function call. For example:

  foo 1 |> bar 2 |> baz 3

is ambiguous and should be written as

  foo(1) |> bar(2) |> baz(3)

true
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!