在Erlang中,如何动态调用函数?

ott*_*akt 13 erlang

我想用要调用的函数的名称调用xyz.

-module(sample).
-export([xyz/1]).

xyz(Name) -> Name().

p() -> "you called p".
g() -> "you called g".
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

1> c(sample.erl).
./sample.erl:6: Warning: function p/0 is unused
./sample.erl:7: Warning: function g/0 is unused
{ok,sample}
2> sample:xyz('p').
** exception error: bad function p
     in function  sample:xyz/1
3>
Run Code Online (Sandbox Code Playgroud)

Chr*_*ian 23

你必须输出p和g是正确的.然后,您可以使用apply/3来调用它.

erlang:apply(sample, p, [])
Run Code Online (Sandbox Code Playgroud)

只有fun-values可以与Fun(...)语法一起使用.你传递的是原子值.当错误消息消失时,原子是一个"坏函数".你可以做类似的事情

xyz(p) -> fun p/0;
xyz(g) -> fun g/0.
Run Code Online (Sandbox Code Playgroud)

然后继续打电话

Fun = xyz(p),
Fun()
Run Code Online (Sandbox Code Playgroud)


Zed*_*Zed 8

-module(sample).
-export([xyz/1, p/0, g/0]).

xyz(Name) -> ?MODULE:Name().

p() -> "you called p".
g() -> "you called g".


1> sample:xyz(p).
"you called p"
Run Code Online (Sandbox Code Playgroud)

  • 如果你像戈登或克里斯蒂安那样建议,那么你不需要出口它们.作为权衡,如果稍后添加s()函数,则还需要修改xyz()的代码.如果使用动态解决方案,则需要导出功能.在您的代码文档中,您可以清楚地说明p和g是内部导出的函数,不应该被调用.此外,在函数式语言中,有人调用函数只是为了好玩不应该导致一个主要问题. (2认同)

Gor*_*rie 7

模式匹配是使用的习语:

-module(sample).
-export([xyz/1]).

xyz(p) -> p();
xyz(q) -> g().

p() -> "you called p".
g() -> "you called g".
Run Code Online (Sandbox Code Playgroud)

如果您想要动态,可以使用gen_event服务器.

本质上这是一个服务器,它包含一个由键/功能对组成的状态,如下所示:

[{p, #func1},
 {g, #func2},
 {..., ...},
 ...]
Run Code Online (Sandbox Code Playgroud)

然后,您可以将事件绑定到函数.(不用说,还有更多的东西.