可以在erlang消息上发送什么类型的类型?

Fed*_*ico 8 erlang erlang-otp gen-server

主要是我想知道我是否可以在分布式erlang设置中的消息中发送函数.

在机器1上

F1 = Fun()-> hey end,

gen_server:call(on_other_machine,F1)
Run Code Online (Sandbox Code Playgroud)

在机器2上

handler_call(Function,From,State) ->
{reply,Function(),State)
Run Code Online (Sandbox Code Playgroud)

合理?

Rob*_*loi 9

是一篇关于"将趣味传递给其他Erlang节点"的有趣文章.简要地恢复:

[...]您可能知道,Erlang发布通过发送术语的二进制编码来工作; 所以发送一个乐趣也基本上是通过使用erlang编码来完成的:term_to_binary/1; 将生成的二进制文件传递给另一个节点,然后使用erlang:binary_to_term/1再次对其进行解码.[...]这对于大多数数据类型来说非常明显; 但它如何适用于功能对象?

编码乐趣时,编码的只是对函数的引用,而不是函数实现.[...]

[...]函数的定义未传递; 如果模块在那里,只需要足够的信息来重建其他节点的乐趣.

[...]如果尚未加载包含乐趣的模块,并且目标节点以交互模式运行; 然后使用常规模块加载机制(包含在模块error_handler中)尝试加载模块; 然后它试图查看所述模块中是否有与给定id相关的乐趣.但是,当您尝试应用此功能时,这种情况只会延迟发生.

[...]如果您从未尝试应用此功能,则不会发生任何不良事件.乐趣可以传递到另一个节点(有问题的模块/乐趣),然后每个人都很高兴.也许目标节点有一个加载了所述名称的模块,但也许是一个不同的版本; 然后很可能会有不同的MD5校验和,如果你尝试应用它,你会得到错误badfun.

我建议你阅读整篇文章,因为它非常有趣.


Ada*_*erg 6

您可以发送任何有效的Erlang术语.虽然发送乐趣时必须小心.引用模块内部函数的任何乐趣都需要该模块存在于目标节点上才能工作:

(first@host)9> rpc:call(second@host, erlang, apply,
                        [fun io:format/1, ["Hey!~n"]]).
Hey!
ok
(first@host)10> mymodule:func("Hey!~n").
5
(first@host)11> rpc:call(second@host, erlang, apply,
                         [fun mymodule:func/1, ["Hey!~n"]]).
{badrpc,{'EXIT',{undef,[{mymodule,func,["Hey!~n"]},
                        {rpc,'-handle_call_call/6-fun-0-',5}]}}}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,它io存在于两个节点上,它可以io作为一个有趣的方式发送一个函数.但是,mymodule仅存在于第一个节点上,并且undef当在另一个节点上调用时,fun会生成异常.