2010-12-01 59 views
12

我有2個要執行的代碼部分。兩者都是條件Erlang相當於if else

if Value1 < N do something 

else if Value1 >= N do something 

if Value2 < N do something 

else if Value2 >= N do something 

我希望在每個執行的聲明。

如何在erlang中工作?沒有別的。我使用多個警衛,但是看起來我有4個if語句。在組2中。

if some condition 
code; 

if other condition 
code 

end. 

我得到一個語法錯誤。

+0

我發現如果你依靠警衛或案例陳述,你很可能在Erlang的時間裏「做錯了」__most__。你可能應該在Erlang做模式匹配__most__作爲守衛和case語句的替代。沒有一個具體的例子,我們不能告訴你是否應該做案例,守衛或模式匹配,但模式匹配是__always__寫與備選方案相比。 – 2010-12-03 18:30:00

+0

可能重複的[如何實現if-else](http://stackoverflow.com/questions/963918/how-to-implement-if-else) – 2013-09-04 16:10:26

回答

18

一個if形式爲:

if 
    <guard 1> -> <body1> ; 
    <guard 2> -> <body2> ; 
    ... 
end 

它在if-clause從上到下的順序(這是定義的)中工作,直到它到達一個成功的測試,然後評估該子句的正文,並且if表達式返回最後一個表達式的值身體。所以其他語言中的else位被燒入其中。如果沒有任何警衛成功,則會生成if_clause錯誤。一個普通的全能守衛就是總是成功的true,但是一切都可以成爲事實。

用於case形式爲:

case <expr> of 
    <pat 1> -> <body1> ; 
    <pat 2> -> <body2> ; 
    ... 
end 

它通過第一分析和隨後嘗試與在運算向下的順序的情況下子句模式,值(這被定義)匹配直到一個匹配,那麼該子句的主體是 評估和case表達式返回正文中的最後一個表達式值。如果沒有模式匹配,則會生成case_clause錯誤。

請注意,ifcase都是表達式(一切都是表達式),所以它們都必須返回值。這是爲什麼沒有默認值,如果沒有成功/匹配的原因之一。也強迫你覆蓋所有選項;這對case尤其重要。 if只是case的一個退化情況,所以它繼承了它。在Erlang理論中有一些if的歷史記錄,您可以在trapexit.org的用戶貢獻下找到它。

13

如果沒有true語句選項,Erlang不允許您擁有if。無論這是真實的陳述還是實際的true都取決於你,但在其他語言中使用true作爲else是司空見慣的。

if 
    some_condition -> some_code; 
    some_other_condition -> some_other_code; 
    true -> else_code 
end. 

請參閱「如果?請點擊this頁面瞭解更多信息。

+4

它肯定允許有一個`if`沒有`true `分支,在這種情況下會在運行時拋出一個異常。 – 2010-12-01 20:21:23

5

首先,我建議你習慣於用「情況」語句,因爲「如果」條件的限制,以保護表達式的:

case custom_call(A) of 
    1 -> do1(A); 
    2 -> do2(A) 
end. 

有做除了「條件執行的另一種方式如果」和 '案' 是從作品出發R13:

1> N =10. 
    10 
    2> ((N > 10) andalso more).  
    false 
    3> ((N == 10) andalso equals). 
    equals 
5

還記得if Erlang有一個返回值,它是一個表達式。它是而不是if就像在C或Java中一樣。

如果你想做一些事情的值,代碼應該是這樣的;

if 
    % do something and get the value 
    X >= Val -> Something; 
    % for doing something otherwise and get the value 
    true -> Else_than_the_Something 
end. 

查看Section for the if expression of Erlang Reference Manual瞭解更多詳情。