如何获得Erlang集群中的当前节点名称?

Sar*_*ara 1 erlang

我的模块“ 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
Run Code Online (Sandbox Code Playgroud)

Luk*_*kas 5

不知道您是否仅在代码中使用示例,但是bif node()不会仅返回具有节点名称的原子,还会返回主机名。

node() = node1@localhost.
Run Code Online (Sandbox Code Playgroud)

这就是您的代码无法正常运行的原因。


arc*_*lus 5

有一些内置函数可以在这里提供帮助,erlang:node/0返回对其进行评估erlang:nodes(connected)的节点的名称并返回您当前连接到的节点的名称。

因此,您可以编写hash/1函数H向每个连接的节点发送消息,如下所示:

hash(H) ->
    lists:foreach(fun (N) -> message(N, H) end,
                  erlang:nodes(connected)).
Run Code Online (Sandbox Code Playgroud)

您示例中的错误消息来自 if 表达式中的任何子句都不为真 - node() 不等于 node1、node2 或 node3。通常的做法是通过提供一个true -> expression分支来避免这种情况——else其他语言中的表达式是什么。