我的模块名为“message_passing”中有一个名为“message / 2”的函数,此函数在另一个函数hash / 1中调用;;;现在这里是问题所在。我需要3个名为node1,node2,node3的节点,但是当我想在名为“Current_Node”的变量中获取当前节点时,它会运行。它显示错误。它无法获取我的变量中的当前节点。如果您的解决方案请发送电子邮件至deep_vision87@hotmail.com,我将非常感谢。
** 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
答案 0 :(得分:4)
不确定您是否只在代码中使用示例,但bif node()不返回仅包含节点名称的atom,也会返回主机名。
node() = node1@localhost.
这就是为什么你的代码没有像你想象的那样工作的原因。
答案 1 :(得分:4)
有一些内置函数可以在这里提供帮助,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
分支来避免这种情况 - 在其他语言中使用else
表达式。
答案 2 :(得分:3)
hash(H) ->
Nodes = [node1, node2, node3],
CurrentNode = node(),
[message(N, H) || N <- Nodes, N =/= CurrentNode],
ok.
答案 3 :(得分: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()]).