6 votes

Qu'est-ce que le signe égal dans un paramètre de fonction en Elixir ?

J'ai défini un Foo module comme celui-ci :

defmodule Foo do
  def hello(x = %{name: name}) do
    IO.inspect [x, name]
  end
end

Si je lance l'application Foo.hello(%{name: "Alice"}) J'obtiens le résultat suivant :

[%{name: "Alice"}, "Alice"]

Ensuite, j'ai appris que je pouvais réécrire la Foo sans en modifier la fonctionnalité :

defmodule Foo do
  def hello(%{name: name} = x) do
    IO.inspect [x, name]
  end
end

Pourquoi cela est-il possible ? Qu'est-ce que le signe égal dans un paramètre de fonction ? S'agit-il d'un opérateur de correspondance normal ?

Selon moi, l'opérateur = fait correspondre la valeur du côté droit au modèle du côté gauche.

[Editer]

Après avoir lu la réponse de Justin, j'ai posté une réponse moi-même. Mais j'ai toujours besoin d'aide.

Je souhaite savoir si le = se comporte différemment à l'intérieur de la tête de la fonction et pourquoi.

Et je souhaite trouver une documentation officielle si elle est disponible.

4voto

Justin Wood Points 6978

Il s'agit en effet toujours de l'opérateur de match.

La raison pour laquelle vous pouvez faire cela est la même que celle pour laquelle vous pouvez faire une correspondance comme ceci

iex(1)> 1 = x

** (CompileError) iex:3: undefined function x/0
iex(2)> x = 1
1
iex(3)> 1 = x
1

A l'intérieur de votre tête de fonction, x a une valeur dès que vous utilisez la fonction et que vous lui passez un argument (c'est la même raison pour laquelle vous pouvez définir la fonction en tant que def hello(x) do ... end ). Cela signifie que vous êtes autorisé à l'utiliser sur le côté droit de l'opérateur de match.

2voto

Tsutomu Points 749

Après avoir cherché sur Google, j'ai trouvé une explication sur le site suivant http://learnyousomeerlang.com/syntax-in-functions .

Cet article fait référence à un Erlang la fonction :

valid_time({Date = {Y,M,D}, Time = {H,Min,S}}) ->
  io:format("The Date tuple (~p) says today is: ~p/~p/~p,~n",[Date,Y,M,D]),
  io:format("The time tuple (~p) indicates: ~p:~p:~p.~n", [Time,H,Min,S]);

Ensuite, il est dit :

Notez qu'il est possible d'utiliser l'option = dans l'en-tête de la fonction, ce qui nous permet de faire correspondre à la fois le contenu d'un tuple ( {Y,M,D} ) et le tuple dans son ensemble ( Date ).

Il s'agit de Erlang mais il semble que le mécanisme soit le même sur Elixir.

À titre expérimental, j'ai réécrit le Foo comme suit :

defmodule Foo do
  def hello(%{name: x} = %{name: y}) do
    IO.inspect [x, y]
  end
end

J'ai ensuite exécuté le Foo.hello(%{name: "Alice"}) et j'ai obtenu ceci :

["Alice", "Alice"]

La recherche de motifs sur l'argument est effectuée par rapport à deux motifs sur à la fois des côtés de la = de l'opérateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X