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

| 我主要想知道是否可以在分布式Erlang设置中的消息中发送函数。 在机器1上:
F1 = Fun()-> hey end,

gen_server:call(on_other_machine,F1)
在机器2上:
handler_call(Function,From,State) ->
{reply,Function(),State)
是否有意义?     
已邀请:
这是关于“将乐趣传递给其他Erlang节点”的有趣文章。要简短地恢复它:   [...]如您所知,Erlang发行版   通过发送二进制编码来工作   条款所以发个乐子也是   本质上是通过使用   erlang:term_to_binary / 1;通过   结果二进制文件到另一个节点,并且   然后使用再次解码   erlang:binary_to_term / 1。[...]   这很明显   对于大多数数据类型;但是如何   为功能对象工作?      当您编码乐趣时,编码内容是什么   只是对该功能的引用,   不是功能实现。   [...]      [...]函数的定义未传递;如果模块在那里,则恰好有足够的信息可以在另一个节点上重新创建乐趣。      [...]如果尚未加载包含乐趣的模块,并且目标节点以交互方式运行;然后尝试使用常规模块加载机制(包含在模块error_handler中)加载模块;然后尝试查看在所述模块中是否可以使用具有给定ID的乐趣。但是,这仅在您尝试应用该功能时才发生。      [...]如果您从未尝试应用该功能,则不会发生任何不良情况。可以将乐趣传递到另一个节点(该节点具有所讨论的模块/乐趣),然后每个人都很高兴。   也许目标节点加载了一个具有上述名称的模块,但是版本可能有所不同。那么很有可能会有不同的MD5校验和,那么如果尝试应用它,则会得到错误badfun。 我建议您阅读整篇文章,因为它非常有趣。     
您可以发送任何有效的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}]}}}
在此示例中,两个节点上都存在
io
,并且可以很有趣地发送来自
io
的函数。但是,
mymodule
仅存在于第一个节点上,当在另一个节点上调用时,fun会生成an6ѭ异常。     
至于匿名函数,似乎可以按预期发送和运行它们。 t1 @ localhost:
(t1@localhost)7> register(shell, self()).
true
(t1@localhost)10> A = me, receive Fun when is_function(Fun) -> Fun(A) end.
hello me you
ok
t2 @ localhost:
(t2@localhost)11> B = you.
you
(t2@localhost)12> Fn2 = fun (A) -> io:format(\"hello ~p ~p~n\", [A, B]) end.
#Fun<erl_eval.6.54118792>
(t2@localhost)13> {shell, \'t1@localhost\'} ! Fn2.
我将覆盖逻辑添加到基于riak-core的应用程序中,如果不能在消息中使用匿名函数,则合并的结果合并可能会很棘手。 还要检查riak_kv / src / riak_kv_coverage_filter.erl 我想riak_kv可能会用它来获得9分的结果。     

要回复问题请先登录注册