这是我的怀疑,因为这个简单的代码
-module(simple_server).
-export( [sayHello/0] ).
-callback say(Num :: term()) -> term().
sayHello() ->
io:fwrite( "Hello 1: ~p\n", [ say(1) ]) ,
io:fwrite( "Hello 2: ~p\n", [ say(2) ]) .
编译失败:
$ erlc simple_server.erl
simple_server.erl:7: function say/1 undefined
simple_server.erl:8: function say/1 undefined
如果是这种情况,那么在其他地方没有明确评论:官方文档,“学习erlang”,这个答案。
您需要提供回调模块的名称,这可以通过apply
和完成spawn
,但您也可以使用变量作为模块名称进行简单调用,例如CallbackModule:say(1)
.
所以你可以这样做:
sayHello(CallbackModule) ->
io:fwrite( "Hello 1: ~p\n", [ CallbackModule:say(1) ]) ,
io:fwrite( "Hello 2: ~p\n", [ CallbackModule:say(2) ]) .
或者
sayHello(CallbackModule) ->
io:fwrite( "Hello 1: ~p\n", [ apply(CallbackModule, say, [1]) ]) ,
io:fwrite( "Hello 2: ~p\n", [ apply(CallbackModule, say, [2]) ]) .
这两个版本是等价的。
让我们创建一个实现simple_server
行为的回调模块:
-module(my_callback).
-behaviour(simple_server).
-export([say/1]).
say(N) ->
{N, is, the, loneliest, number}.
现在我们可以simple_server:sayHello
使用模块名称作为参数调用:
> simple_server:sayHello(my_callback).
Hello 1: {1,is,the,loneliest,number}
Hello 2: {2,is,the,loneliest,number}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句