erlang的case和if

case Expr of
    Pattern1 [when Guard1] -> Seq1;
    Pattern2 [when Guard2] -> Seq2;
    ...
    PatternN [when GuardN] -> SeqN
end

首先,對Expr求值,然後,Expr的值將依次與模式Pattern1Pattern2……PatternN進行匹配,直到匹配成功。如果找到一個匹配並且(可選的)的保護式成立,則對應的調用序列將被求值。注意case保護式與函數保護式形式相同。case原語的值就是被選中的序列的值。

舉個例子,比方說我們我有個函數allocate(Resource)用於分配某種資源Resource。假設這個函數只返回{yes, Address}no。這樣,這個函數便可以放在一個case結構裏:

case allocate(Resource) of
    {yes,Address} when Address > 0, Address => Max ->
        Sequence 1 ... ;
    no ->
        Sequence 2 ...
end

如果沒有匹配項,則會引發錯誤,所以我們經常這樣寫:

case allocate(Resource) of
    {yes,Address} when Address > 0, Address => Max ->
        Sequence 1 ... ;
    no ->
        Sequence 2 ...;
     _ ->
        true
end


if
    Guard1 ->
        Sequence1 ;
    Guard2 ->
        Sequence2 ;
    ...
end
在這種情況下,保護式Guard1,...將被依次求值。如果一個保護式成立則對與之關聯的序列求值。該序列的求值結果便是if結構的結果。if保護式與函數保護式形式相同。與case相同,一個保護式都不成立的話將引發一個錯誤。如果需要,可以增加保護式斷言true作爲垃圾箱:
test(A)->
	B=if 
		is_float(A)->
			A*10;
		is_list(A)->
			A;
		true->
		true
	end,
B.


轉:http://www.erlang-cn.com/242.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章