2016-03-22 8 views
2

Matching in die gleiche Variable, mit dem gleichen Wert. Dies funktioniert:Wie funktioniert Musterabgleich von Vielfachen der gleichen Variablen auf der linken Seite in Elixier

iex(21)> {a, a} = {1, 1} 
{1, 1} 

In die gleiche Variable passen, unterschiedliche Werte. Diejenigen, dies nicht tun:

iex(22)> {a, a} = {1, 2} 
** (MatchError) no match of right hand side value: {1, 2} 

iex(22)> {a, a} = {2, 1} 
** (MatchError) no match of right hand side value: {2, 1} 

ich verstehen kann, wenn der Operator^warum das funktioniert:

iex(22)> b = 1 
1 
iex(23)> {a, ^b} = {1, 1} 
{1, 1} 

Aber ich bin ein wenig verwirrt, warum dies nicht:

iex(24)> a = 2 
2 
iex(25)> {a, ^a} = {1, 1} 
** (MatchError) no match of right hand side value: {1, 1} 

Mein erster Gedanke war, dass das letzte Beispiel funktionieren würde. Wenn der interne Mechanismus hinter der Szene eine Platzierung der Variablen vornimmt und dann ihren Wert für die nächste Übereinstimmung verwendet, wenn sie auf die gleiche Variable wie im ersten Beispiel passt.

Ich bin neugierig, wie funktioniert das Muster übereinstimmen auf Vielfachen der gleichen Variablen intern in Elixir?

Antwort

3

Nun, ich bin mir nicht sicher, was Sie von

erwartet
{a, a} = {1, 2} 

man bedenkt, dass Sie versuchen, zwei verschiedene Werte auf die gleiche Variable zu binden.

zweiten Teil betrifft, so, wie Sie selbst erwähnt, ist der Operator^verwendet den Wert der Variablen Muster Spiel gegen so, wenn Sie tun

a = 2 
{a, ^a} = {1, 1} 

es ist so ziemlich das gleiche wie

{a, 2} = {1, 1} 

und offensichtlich 2! = 1 und daher gibt es keine Übereinstimmung

+0

Vielen Dank für die Antwort. Ich bin mir dessen bewusst, wie ich es in meiner Frage dargelegt habe. Um zu klären, wenn nötig, meine Frage und was mich interessiert ist, was geht intern weiter? Wenn "a = 2; {a,^a} = {1,1}" ist, behält die Ausführung das alte "a = 2" in einer Art "Geltungsbereich" bei und führt dann die erste Übereinstimmung von "a" und für das zweite "a", verwendet das alte 'scope'. Ändert die Mach-Zuweisung auf dem ersten "a" den "scope" nur dann, wenn zuvor "a" nicht definiert wurde. – elpddev

2

Andere haben vielleicht einen tieferen Einblick in was passiert, aber das ist mein mentales Modell dieser Aussage:

{a, a} = {1,1} 

erster diesen etwas einfacheren Fall betrachten:

a = 1 

In diesem Fall ist es eine Kombination aus einer Behauptung und eine Bindung. Das heißt, wenn die Bindung 1 an a die Aussage wahr macht, passiert das. Vergleichen Sie dies mit

^a = 1 

Der Stift nicht Rebinding erlaubt also, wenn a bereits einen Wert hat, wenn es nicht 1 ist, dann wird das Spiel nicht. Auch wenn Sie diese Aussage versuchen, bevor a auf einen Wert gebunden wurde, erhalten Sie diese Fehlermeldung erhalten: ** (CompileError) iex:1: unbound variable ^a

So im Fall Ihres Tupel, glaube ich, was unter der Haube vor sich geht, so zu sprechen, ist, dass erste a ist an 1 gebunden. Dann ist die zweite a in dem Ausdruck bereits an 1 gebunden worden, also, wenn es versucht, es mit 2 übereinzustimmen, schlägt dieses fehl. Das heißt, die Bindung tritt nur auf, wenn der betreffende Wert (a in diesem Fall) nicht bereits an etwas anderes gebunden ist.Es ist hilfreich, es als zwei Schritte zu betrachten - einen verbindlichen Schritt und dann einen passenden Schritt.

2

Interessanterweise können Sie den gemerkte Wert von a entsprechen und auch a in der gleichen Zeile wie folgt neu binden:

iex> a = 2 
2 
iex> {a, ^a} = {1, 2} 
{1, 2} 
iex> a 
1 

In diesem Fall ^a den zuvor gebundenen Wert für a entspricht (die 2) und a wird zu 1 zurückspringen, um die Übereinstimmung zu bilden.

Basierend auf diesem Ergebnis findet das Matching vor der Wiederverbindung statt, aber ich würde nicht empfehlen, so etwas zu tun, weil es unklar wäre, was tatsächlich passiert.

Verwandte Themen