2009-06-08 15 views
22

Jak zaimplementować to wyrażenie if-else w erlangu?Jak zaimplementować if-else

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

Patrz także [to pytanie] (http://stackoverflow.com/questions/4327860/erlang-equivalent-to-if-else). – legoscia

Odpowiedz

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

Nie ma prawdziwego indziej w Erlang, po prostu pasuje z prawdą. Więcej informacji pod numerem Erlang documentation.

Należy zwrócić szczególną uwagę na ";" terminator:

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

Nie jest to język przyjazny dla kopiowania i wklejania.

+0

Gud one thanx dużo – Abhimanyu

+0

nie jest operatorem równości w Erlang '=: ='? – Tommy

+0

Należy również zauważyć, że jest to błąd, jeśli żaden z warunków nie pasuje, stąd prawdziwe klauzula jako koniec jako upadek. –

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

lub

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

lub

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

lub

foo(A,B), ... 

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

dopasowanie Wzór jest jednym z Erlangs wiele zalet i może być często używana zamiast if. Często jest bardziej czytelne dopasowanie do wzorca argumentów funkcji lub użycie wyrażenia case (które również jest dopasowaniem do wzorca).

Załóżmy, że masz funkcję some_function, która pobiera dwa argumenty. Jeśli argumenty są równe, oceniasz wyrażenie1, w przeciwnym razie ocenisz wyrażenie expression2. Można to wyrazić w języku erlang:

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

To niesamowite, ile można osiągnąć dzięki temu prostemu dopasowywaniu wzorców. Z klauzul ochronnych można wyrazić bardziej skomplikowane wzory, np

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

Inną możliwością jest użycie wyrażenia case .. of. Twój szczególności Przykładem może przełożyć się

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

(w tym przypadku expression2 zawsze będzie oceniana od a i b atomy i nigdy nie równa się nawzajem. Zmienne w Erlang są wielkie litery).

Możesz przeczytać więcej o wyrażeniach Erlang here.

+4

Proponuję również użycie '=: =' zamiast z '=='. To jest naprawdę dobra odpowiedź - nowi programiści erlang powinni zawsze używać "case", dopóki nie zrozumieją, dlaczego instrukcja "if" powinna być instrukcją 'when'. – archaelus

8

Inną opcją:

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