完成@byaruhaf答案的情況下子句的左側部分不需要時編譯爲恆定。下面的代碼是有效的,顯然Temp
在編譯時是未知的(但是foo(5)的計算結果爲nope!)。
-module(erltoy).
-compile(export_all).
isFive(5) -> true;
isFive(_) -> false.
foo(X) ->
Temp = isFive(X),
case X of
Temp -> true;
3 -> false;
_ -> nope
end.
它的左邊是在執行時間約束,甚至沒有必要的,例如,這也是有效的,並有I
是這樣評價之前未結合,而圖案匹配期間約束:
get_second_element_of_3_terms_tuple_if_pos_integer(X) ->
case X of
{_,I,_} when is_integer(I), I>0 -> {true,I};
_ -> false
end.
的情況下的左側部分必須是具有可選的後衛序列有效模式。
有效模式是可以包含未結合的變量一個Erlang術語,其也可以包含算術表達式,如果他們遵守2個條件
- 它僅使用數字或位運算符。遵從當
- 它的值可以被計算爲一個常數。
保護序列的定義給出there in erlang documentation
最後一點,平時的二郎神的實現代碼的那種在你的例子給定的測試功能是使用不同功能的頭,就像你做是五/ 1定義。