Der Grund, warum der ternäre Operator _ ? _ : _
in vielen Sprachen existiert, liegt an der Tatsache, dass sie zwei syntaktische Klassen haben: Statements und Expressions. Da if-then-else-Konstruktionen normalerweise der Anweisung-Klasse angehören, gibt es keine Möglichkeit, das zu erhalten, wenn Sie einen Ausdruck eingeben. Daher fügen Sie den Operator _ ? _ : _
der Ausdrucksklasse hinzu.
Wie ein anderer Beitrag sagt, können Sie a == b ? true : false
nehmen und einfach a == b
schreiben, aber das erklärt nicht den allgemeinen Fall, dass wir a == b ? X : Y
für beliebige Ausdrücke X
und Y
haben könnten. Beachten Sie auch, dass a == b
in Erlang immer false
ist. Sie könnten also argumentieren, dass der gesamte Ausdruck durch false
ersetzt werden muss.
Glücklicherweise hat Erlang, wie es für die meisten funktionalen Sprachen der Fall ist, nur eine syntaktische Klasse, Ausdrücke. Daher können Sie case a == b of X -> ...; Y -> ... end
an einer beliebigen Stelle in einer Funktion verwenden, andere Ausdrücke eingeschlossen. Mit anderen Worten, der ternäre Operator _ ? _ : _
ist in Erlang redundant, da case
bereits funktioniert.
Nehmen wir an, wir sollen eine einfache Proplist zurückgeben und wir müssen etwas berechnen, was wir tun müssen
%Vor% Aber da die case
-Konstruktion ein Ausdruck ist, können wir sie einfach inline einfügen:
und mit dem Ding fertig sein.
Die if .. end
Konstruktion in Erlang ist normalerweise nicht das was du willst. Sie wollen in diesem Fall einen Wert a == b
hinterfragen und es kann einen von zwei Ausgaben true
oder false
ergeben. In diesem Fall ist der case
-Ausdruck direkter. Der if
wird besser verwendet, wenn Sie nach mehreren verschiedenen Tests suchen und den ersten passenden auswählen müssen, während wir hier nur einen einzigen Test durchführen müssen.
Da a == b ? true : false
auf a == b
abbildet, können Sie auch in Erlang a == b
verwenden.
Sie können 'if' wie das
verwenden %Vor%speziell?: Form scheint nicht notwendig zu sein. Du kannst natürlich auch true / false als Rückgabewert verwenden, aber ich denke du meinst eine allgemeinere Form, da diese unbrauchbar wäre (A == B macht die gleiche Arbeit).
@ Gabes Antwort ist die prägnanteste und (soweit ich das beurteilen kann) idiomatisch. Der C-Ausdruck ((A==B) ? X : Y)
entspricht direkt dem Erlang-Ausdruck
Allerdings ist viel mehr Code als die C-Version. Sie sollten es wahrscheinlich in eine Komfortfunktion einpacken - und jemand sollte mir sagen, ob das bereits in den Erlang-Standardbibliotheken existiert!
%Vor% Dann wird Ihr C-Ausdruck einfach iff(A == B, X, Y)
. Aber Vorsicht! dass Erlang wie auch C eifrig Funktionsargumente auswertet. Wenn X
oder Y
Nebenwirkungen haben oder teuer zu bewerten sind, dann ist iff
nicht gleichbedeutend mit einem inline case
Ausdruck.
Tags und Links erlang