2009-06-08 21 views
22

Come si implementa questa espressione if-else in erlang?Come implementare if-else

if(a == b) { 
    expression1 
} else { 
    expression2 
} 
+0

Vedi anche [questa domanda] (http://stackoverflow.com/questions/4327860/erlang-equivalent-to-if-else). – legoscia

risposta

31
if 
    a == b -> 
     expr1; 
    true -> 
     exprElse 
end 

non c'è nessun altro vero e proprio in Erlang, basta abbinare con vera. Maggiori informazioni allo Erlang documentation.

Devi prestare molta attenzione al ';' terminatore:

if 
    a == b -> 
     clauseN, 
     expr1; 
    cond2 -> 
     clause1, 
     clause2, 
     expr2; 
    cond3 -> 
     expr3; 
    true -> 
     exprElse 
end 

Non è un linguaggio compatibile con copia-incolla.

+0

Gud one grazie molto – Abhimanyu

+0

non è l'operatore di uguaglianza in Erlang '=: ='? – Tommy

+0

Si noti inoltre che si tratta di un errore se nessuna delle condizioni corrisponde, quindi la clausola vera come la fine come una caduta attraverso. –

15
if 
    A =:= B -> 
     expr1; 
    true -> 
     expr2 
end 

o

case A =:= B of 
    true -> expr1; 
    false -> expr2 
end 

o

case A of 
    B -> expr1; 
    _ -> expr2 
end 

o

foo(A,B), ... 

... 
foo(X,X) -> expr1; 
foo(_,_) -> expr2. 
19

pattern matching è uno dei erlangs tanti punti di forza e spesso può essere usato al posto di if. Spesso è più leggibile per la corrispondenza del modello sugli argomenti della funzione o usa un'espressione caso (che è anche la corrispondenza del modello).

Supponiamo di avere una funzione some_function che accetta due argomenti. Se gli argomenti sono uguali, valuti expression1, altrimenti valuti expression2. Questo può essere espresso in Erlang come:

some_function(A, A) -> expression1; 
some_function(A, B) -> expression2. 

E 'abbastanza incredibile quanto si può ottenere con questo tipo di semplici pattern matching. Con clausole di guardia è possibile esprimere i modelli più complessi, per esempio,

some_function(A, B) when A < B -> expression3. 

Un'altra possibilità è quella di utilizzare un'espressione case .. of. Il vostro esempio particolare si tradurrebbe in

case a == b of 
    true -> expression1; 
    false -> expression2 
end. 

(in questo caso expression2 sarebbe sempre essere valutati dal a e b sono atomi e mai uguali tra loro. Le variabili in Erlang sono maiuscole.)

Potete leggere altro sulle espressioni di Erlang here.

+4

Ti suggerisco anche di usare' =: = ' di '=='. Questa è una buona risposta - i nuovi programmatori di erlang dovrebbero sempre usare 'case' finché non capiscono perché l'istruzione' if' avrebbe dovuto essere l'istruzione 'when'. – archaelus

8

Un'altra opzione:

case a of 
    b -> expr1; %% true 
    _ -> expr2 %% false 
end.