[英]How to get the current node name in an erlang cluster?
我在名為“ message_passing”的模塊中有一個名為“ message / 2”的函數,該函數在另一個函數hash / 1中調用。 我需要3個名為node1,node2和node3的節點,但是當我想在名為“ Current_Node”的變量中獲取當前節點時,它將無法正常工作。 顯示錯誤。 它無法在變量中獲取當前節點。
** exception error: no true branch found when evaluating an if expression
in function message_passing:hash/1
hash(H)->
Current_Node=node(),
if
Current_Node==node1->
message(node2,H),
message(node3,H);
Current_Node==node2->
message(node1,H),
message(node3,H);
Current_Node==node3->
message(node1,H),
message(node2,H)
end
不知道您是否僅在代碼中使用示例,但是bif node()不會僅返回具有節點名稱的原子,還會返回主機名。
node() = node1@localhost.
這就是您的代碼無法正常運行的原因。
有一些內置函數可以在此處提供幫助, erlang:node/0
返回在其上評估的節點的名稱,而erlang:nodes(connected)
返回當前連接到的節點的名稱。
因此,您可以編寫hash/1
函數以將消息H
發送到每個連接的節點,如下所示:
hash(H) ->
lists:foreach(fun (N) -> message(N, H) end,
erlang:nodes(connected)).
您的示例中的錯誤消息來自if表達式為true的子句-node()不等於node1,node2或node3。 通常的做法是通過提供true -> expression
分支來避免這種true -> expression
在其他語言中,這將是else
表達式。
hash(H) ->
Nodes = [node1, node2, node3],
CurrentNode = node(),
[message(N, H) || N <- Nodes, N =/= CurrentNode],
ok.
您遇到的問題是您嘗試使用if
在沒有默認條件的情況下進行比賽(並且不滿足您的預定義條件之一)。
我不認為我曾經使用過if
在一個Erlang的應用程序,但我覺得有更多簡單的方法做到你想在這里什么(你將不必重寫代碼,當您添加第四個節點)。
您確定不是要寫這個嗎?
lists:foreach(fun(N) -> message(N, H) end, nodes()).
或者,也許這樣:
lists:foreach(fun(N) -> message(N, H) end, [node1, node2, node3] -- [node()]).
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.