Elixir - Correspondance de motifs

Le pattern matching est une technique dont Elixir hérite d'Erlang. C'est une technique très puissante qui nous permet d'extraire des sous-structures plus simples à partir de structures de données complexes telles que des listes, des tuples, des cartes, etc.

Un match comporte 2 parties principales, une left et un rightcôté. Le côté droit est une structure de données de toute nature. Le côté gauche tente de faire correspondre la structure de données sur le côté droit et de lier toutes les variables de gauche à la sous-structure respective sur la droite. Si aucune correspondance n'est trouvée, l'opérateur génère une erreur.

La correspondance la plus simple est une variable isolée à gauche et n'importe quelle structure de données à droite. This variable will match anything. Par exemple,

x = 12
x = "Hello"
IO.puts(x)

Vous pouvez placer des variables à l'intérieur d'une structure afin de pouvoir capturer une sous-structure. Par exemple,

[var_1, _unused_var, var_2] = [{"First variable"}, 25, "Second variable" ]
IO.puts(var_1)
IO.puts(var_2)

Cela stockera les valeurs, {"First variable"}dans var_1 et"Second variable"dans var_2 . Il y a aussi un spécial_ variable (ou variables avec le préfixe '_') qui fonctionne exactement comme les autres variables mais indique à elixir, "Make sure something is here, but I don't care exactly what it is.". Dans l'exemple précédent, _unused_var était l'une de ces variables.

Nous pouvons faire correspondre des modèles plus compliqués en utilisant cette technique. Pourexample si vous souhaitez dérouler et obtenir un nombre dans un tuple qui se trouve dans une liste qui est elle-même dans une liste, vous pouvez utiliser la commande suivante -

[_, [_, {a}]] = ["Random string", [:an_atom, {24}]]
IO.puts(a)

Le programme ci-dessus génère le résultat suivant -

24

Cela liera a à 24. Les autres valeurs sont ignorées car nous utilisons «_».

Dans le pattern matching, si nous utilisons une variable sur le right, sa valeur est utilisée. Si vous souhaitez utiliser la valeur d'une variable sur la gauche, vous devrez utiliser l'opérateur pin.

Par exemple, si vous avez une variable "a" ayant la valeur 25 et que vous voulez la faire correspondre avec une autre variable "b" ayant la valeur 25, alors vous devez entrer -

a = 25
b = 25
^a = b

La dernière ligne correspond à la valeur actuelle de a, au lieu de l'attribuer, à la valeur de b. Si nous avons un ensemble non correspondant de côtés gauche et droit, l'opérateur de correspondance génère une erreur. Par exemple, si nous essayons de faire correspondre un tuple avec une liste ou une liste de taille 2 avec une liste de taille 3, une erreur sera affichée.