Wie schreibe ich "a == b? X: Y "in Erlang?

7

Gibt es eine gute Möglichkeit, Code in Erlang zu schreiben?

%Vor%

ist ein Code im Ruby-Stil

    
why 23.05.2011, 04:51
quelle

6 Antworten

34

Erklärung

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.

Ein Beispiel:

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:

%Vor%

und mit dem Ding fertig sein.

Warum ich nicht die Verwendung von IF befürworte

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.

    
I GIVE CRAP ANSWERS 23.05.2011, 07:52
quelle
5

Wenn Sie nach etwas wie A == B ? X : Y als if -Ausdruck fragen, ist es

%Vor%

Sie können es auch als case ausdruck schreiben:

%Vor%

oder

%Vor%     
Gabe 23.05.2011 04:58
quelle
5

Wir verwenden Makro wie folgt:

%Vor%

Dann schreiben Sie in Ihrem Code:

%Vor%     
nivertech 24.07.2011 10:43
quelle
4

Da a == b ? true : false auf a == b abbildet, können Sie auch in Erlang a == b verwenden.

    
Richard Schneider 23.05.2011 05:01
quelle
1

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).

    
Łukasz Milewski 23.05.2011 05:29
quelle
0

@ 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

%Vor%

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.

    
Quuxplusone 13.10.2014 19:09
quelle

Tags und Links