2009-11-04 126 views
0

我在名爲「message_passing」的模塊中有一個名爲「message/2」的函數,該函數在另一個函數hash/1 ;;;;中調用,現在問題來了。我需要3個節點名爲節點1,節點2,節點3,但是當我想要獲取名爲「Current_Node」的變量中的當前節點它dosnt工作。它顯示一個錯誤。它無法在我的變量中獲取當前節點。如果你的解決方案請寄給我[email protected],我會非常感激。如何獲取erlang集羣中的當前節點名稱?

** 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 
+10

請注意,人們來這裏談話,留下證據來幫助他人,並通過提供良好的答案來建立聲譽。要求某人通過電子郵件向系統發送回覆,這有點粗魯。 – Dustin 2009-11-04 08:28:21

回答

2

,你遇到了問題是,你正在嘗試使用if到沒有默認狀態(和預定義的條件之一沒有得到滿足)進行匹配。

我不認爲我曾經在一個erlang應用程序中使用過if,但我認爲有更簡單的方法來做你在這裏嘗試的東西(而且當你的時候你不必重寫你的代碼添加第四個節點)。

你確定你沒有試圖寫這個嗎?

lists:foreach(fun(N) -> message(N, H) end, nodes()). 

或者,也許這樣的:

lists:foreach(fun(N) -> message(N, H) end, [node1, node2, node3] -- [node()]). 
4

如果你只是使用的例子在你的代碼,但BIF節點()不只是節點名稱返回一個原子不知道,主機名字也被返回。

node() = [email protected] 

這將是你的代碼不能正常工作的原因,因爲你認爲它應該。

3
hash(H) -> 
    Nodes = [node1, node2, node3], 
    CurrentNode = node(), 
    [message(N, H) || N <- Nodes, N =/= CurrentNode], 
    ok. 
4

有一些內置功能,可以幫助在這裏,erlang:node/0返回節點的名稱,它是在評估和erlang:nodes(connected)返回當前連接的節點的名稱。

所以,你可以寫hash/1函數來發送消息H給每個連接的節點:

hash(H) -> 
    lists:foreach(fun (N) -> message(N, H) end, 
        erlang:nodes(connected)). 

在您的示例中的錯誤消息來自沒有條款中,如果表達式爲真 - 節點()不等於節點1,節點2或節點3。通過提供true -> expression分支來避免這種情況是常見的做法 - 在其他語言中將會使用else表達式。

相關問題