2017-01-31 4 views
4

ich ein Foo Modul wie folgt definiert sind:Was ist das Gleichheitszeichen innerhalb eines Funktionsparameters in Elixir?

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

Wenn ich die Foo.hello(%{name: "Alice"}) laufen, ich folgendes Ergebnis:

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

Dann erfuhr ich, dass ich ohne Änderung des Foo Modul neu schreiben kann seine Funktionalität wie folgt:

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

Warum ist das möglich? Was ist das Gleichheitszeichen innerhalb eines Funktionsparameters? Ist es ein normaler Match-Operator?

In meinem Verständnis entspricht der Operator = den Wert auf der rechten Seite gegen das Muster auf der linken Seite.

[Bearbeiten]

Nach Justins Antwort lesen, habe ich geschrieben, eine Antwort von mir. Aber ich brauche immer noch Hilfe.

Ich möchte wissen, ob der = Operator sich innerhalb der Funktion Kopf und warum anders verhält.

Und ich möchte eine offizielle Dokumentation finden, wenn verfügbar.

Antwort

2

Es ist in der Tat immer noch der Match-Operator.

Der Grund, warum Sie dies ist der gleiche Grund tun können Sie dieses

iex(1)> 1 = x 

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

In Ihrer Funktion Kopf bieten kann, hat x Wert, sobald Sie die Funktion verwenden und ein Argument hineingeben (gleiche Grund können Sie die Funktion als def hello(x) do ... end definieren). Dies bedeutet, dass Sie es auf der rechten Seite des Spielbetreibers verwenden dürfen.

+0

Danke. Aber, auf dem zweiten 'Foo'-Modul, warum das gegebene Argument an das' x' gebunden ist? Ist dies, weil das 'x' auf der rechten Seite des Operators' = 'liegt? Ich bin mir noch nicht sicher über den ganzen Mechanismus der Wertbindung an die Funktionsparameter. – Tsutomu

+1

'x' hat einen Wert, sobald Sie etwas in die Funktion übergeben, ob es auf der linken oder rechten Seite ist. Wie ich schon sagte, es ist nicht anders als wenn du 'def hallo (x) tust ... end '. Die Variable "top level" wird dem zugewiesen, was Sie an Ihre Funktion übergeben. –

0

Nachdem ich eine Weile gegoogelt hatte, fand ich eine Erklärung auf http://learnyousomeerlang.com/syntax-in-functions.

Dieser Artikel bezieht sich eine Erlang fuction:

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]); 

Dann heißt es:

Beachten Sie, dass es möglich ist, die = Operator im Funktionskopf zu verwenden, so dass wir beide passen der Inhalt innerhalb eines Tupels ({Y,M,D}) und das Tupel als Ganzes (Date).

Es geht um Erlang, aber es scheint der Mechanismus das gleiche auf Elixir ist.

Für Experiment, schrieb ich das Foo Modul wie folgt:

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

Dann lief ich die Foo.hello(%{name: "Alice"}), und bekam dies:

["Alice", "Alice"] 

Das Muster auf dem Argument Abgleich mit zwei Mustern erfolgt auf beide Seiten des = Betreibers.

+1

Diese Antwort sollte hilfreich sein: http://stackoverflow.com/a/36184075/3741729 – PatNowak

Verwandte Themen