guard
guard可以以逗號或者分號分隔,以逗號分隔表示最終的結果為各個guard的and結果,以分號則是只要任意一個guard為true則最終結果為true。
復制代碼 代碼如下:
guard(X, Y) when not(X>Y), is_atom(X) ->
X + Y.
guard在list comprehension中可以篩選元素:
復制代碼 代碼如下:
NewNodes = [Node || Node - AllNodes, not gb_sets:is_member(Node, NewQueried)],
guard中不能使用自定義函數,因為guard應該保證沒有副作用,但自定義函數無法保證這一點,所以erlang禁止在guard中使用自定義函數。
list comprehension
list comprehension是一個非常有用的語法特性,它可以用于構造一個新的list,可以用于將一種list映射到另一種list,可以篩選list元素。只要是跟list相關的操作,優先考慮用list comprehension來實現,將大大減少代碼量。記住list comprehension的語法:
復制代碼 代碼如下:
[Expression || Generators, Guards, Generators, ...]
timer
一定時間后向進程發送消息:
復制代碼 代碼如下:
erlang:send_after(token_lifetime(), self(), renew_token),
一段時間后執行某個函數:
復制代碼 代碼如下:
{ok, TRef} = timer:apply_interval(Interval, ?MODULE, announce, [self()]),
gb_trees/gb_set
pattern match
pattern match有太多作用了:
pattern match in case
case中判定多個值,比其使用邏輯運算符簡潔多了:
復制代碼 代碼如下:
A = 1, B = 2,
case {A, B} of
{_C, _C} -> true;
{_, _} -> false
end
pattern match to check data type
pattern match可以用于檢測變量的類型,可以用于檢測函數的返回值,就像C/C++中的assert一樣,可以用于盡早檢測出異常狀態:
復制代碼 代碼如下:
ping({_, _, _, _} = IP, Port) ->
ok.
{ok, Ret} = call().
list操作
添加元素
添加元素進list有很多方式:
復制代碼 代碼如下:
[2]++[3, 4].
[2|[3,4]].
foldl/foldr
用于遍歷list計算出一個“累加值“。
復制代碼 代碼如下:
lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]).
也就是遍歷一個list,將每個元素傳遞給fun,將fun的返回值繼續傳遞給下一個元素。
zip
將兩個list一一對應構造出一個tuple,作為新的list里的元素。
復制代碼 代碼如下:
lists:zip([1, 2, 3], [4, 5, 6]).
=> [{1,4},{2,5},{3,6}]
數字進制
16##FF,表示16進制數字0xFF,通用格式為scale##num,即scale進制下的num。