Fork me on GitHub

L'opérateur Pipe

L’opérateur pipe |> passe le résultat d’une expression en tant que premier paramètre à une autre expression.

Table des matières

Introduction

Le code peut vite devenir confus. L’appel à une fonction peut être tellement imbriqué que la logique devient difficile à suivre. Prenons cet exemple:

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

Ici nous passons le résultat de other_function/1 à new_function/1, puis de new_function/1 à baz/1, de baz/1 à bar/1 et enfin le résultat de bar/1 à foo/1. Elixir propose une alternative pragmatique à ce chaos syntaxique: l’opérateur pipe. L’opérateur pipe |> prends le résultat d’une expression, et le passe à la suivante. Regardons maintenant le bout de code au dessus re-écrit avec l’opérateur pipe.

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

Le pipe prends le résultat à sa gauche et le passe à sa droite.

Exemples

Nous allons utiliser le module String d’Elixir pour les exemples suivants.

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

Bonnes pratiques

Si l’arité d’une fonction et supérieure à 1, assurez vous d’utiliser des parenthèses. Ce n’est pas nécessaire pour Elixir mais plus pour les autres développeurs qui pourraient mal interpréter votre code. Si on prends notre 3ème exemple, et enlevons les parenthèses de String.ends_with?/2, nous pouvons voir l’avertissement suivant:

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

Partager cette page