Elixir hat zwei Sätze von Booleschen Operatoren:
or
, and
und not
grundsätzlich ihre Argumente erfordern tatsächlichen booleans, dh die Atome true
und false
||
, &&
und !
akzeptieren Argumente zu sein, alle Arten, und prüfen Sie "Wahrheit".
Obwohl in der Tat, or
und and
nur überprüfen Sie die Art des ersten Argument. Für jeden Wert von x
werden die Ausdrücke false or x
und true and x
einfach x
zurückgeben. Dies mag verwirrend erscheinen, erlaubt aber die Verwendung von or
und and
als letzten Ausdruck in einer rekursiven Funktion, ohne die Tail-Rekursion zu behindern.Betrachten wir zum Beispiel diese Funktion, die alle Elemente in einer Liste überprüft, ob auf 42 gleich sind:
def x([]) do
true
end
def x([h|t]) do
h == 42 and x(t)
end
Da and
erlaubt Endrekursion, wird diese Funktion in konstanten Stapelspeicher laufen. Wenn and
den Typ seines zweiten Arguments überprüfen würde, müsste die Funktion einen normalen Aufruf eines Stapelrahmens "tiefer" machen und bei der Rückkehr die Überprüfung durchführen und den Wert zurückgeben.
Danke für die Erklärung nicht nur warum, sondern auch die Gründe dafür – sat