Erlang的一些編程技巧分享
guard
guard可以以逗號(hào)或者分號(hào)分隔,以逗號(hào)分隔表示最終的結(jié)果為各個(gè)guard的and結(jié)果,以分號(hào)則是只要任意一個(gè)guard為true則最終結(jié)果為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中不能使用自定義函數(shù),因?yàn)間uard應(yīng)該保證沒(méi)有副作用,但自定義函數(shù)無(wú)法保證這一點(diǎn),所以erlang禁止在guard中使用自定義函數(shù)。
list comprehension
list comprehension是一個(gè)非常有用的語(yǔ)法特性,它可以用于構(gòu)造一個(gè)新的list,可以用于將一種list映射到另一種list,可以篩選list元素。只要是跟list相關(guān)的操作,優(yōu)先考慮用list comprehension來(lái)實(shí)現(xiàn),將大大減少代碼量。記住list comprehension的語(yǔ)法:
[Expression || Generators, Guards, Generators, ...]
timer
一定時(shí)間后向進(jìn)程發(fā)送消息:
erlang:send_after(token_lifetime(), self(), renew_token),
一段時(shí)間后執(zhí)行某個(gè)函數(shù):
{ok, TRef} = timer:apply_interval(Interval, ?MODULE, announce, [self()]),
gb_trees/gb_set
pattern match
pattern match有太多作用了:
pattern match in case
case中判定多個(gè)值,比其使用邏輯運(yùn)算符簡(jiǎn)潔多了:
A = 1, B = 2,
case {A, B} of
{_C, _C} -> true;
{_, _} -> false
end
pattern match to check data type
pattern match可以用于檢測(cè)變量的類型,可以用于檢測(cè)函數(shù)的返回值,就像C/C++中的assert一樣,可以用于盡早檢測(cè)出異常狀態(tài):
ping({_, _, _, _} = IP, Port) ->
ok.
{ok, Ret} = call().
list操作
添加元素
添加元素進(jìn)list有很多方式:
[2]++[3, 4].
[2|[3,4]].
foldl/foldr
用于遍歷list計(jì)算出一個(gè)“累加值“。
lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]).
也就是遍歷一個(gè)list,將每個(gè)元素傳遞給fun,將fun的返回值繼續(xù)傳遞給下一個(gè)元素。
zip
將兩個(gè)list一一對(duì)應(yīng)構(gòu)造出一個(gè)tuple,作為新的list里的元素。
lists:zip([1, 2, 3], [4, 5, 6]).
=> [{1,4},{2,5},{3,6}]
數(shù)字進(jìn)制
16##FF,表示16進(jìn)制數(shù)字0xFF,通用格式為scale##num,即scale進(jìn)制下的num。
相關(guān)文章
Erlang分布式節(jié)點(diǎn)中的注冊(cè)進(jìn)程使用實(shí)例
這篇文章主要介紹了Erlang分布式節(jié)點(diǎn)中的注冊(cè)進(jìn)程使用實(shí)例,本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-02-02Erlang中的注冊(cè)進(jìn)程使用實(shí)例
這篇文章主要介紹了Erlang中的注冊(cè)進(jìn)程使用實(shí)例,本文給出正常進(jìn)程通信實(shí)例和使用使用注冊(cè)進(jìn)程通信實(shí)例,需要的朋友可以參考下2015-02-02Erlang實(shí)現(xiàn)的百度云推送Android服務(wù)端實(shí)例
這篇文章主要介紹了Erlang實(shí)現(xiàn)的百度云推送Android服務(wù)端實(shí)例,本文先是講解了實(shí)現(xiàn)步驟,然后給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-01-01erlang?on_load_function_failed排查過(guò)程解析
這篇文章主要為大家介紹了erlang?on_load_function_failed的排查過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12