【问题标题】:More info about spawning functions in Erlang有关 Erlang 中生成函数的更多信息
【发布时间】:2012-07-02 22:46:31
【问题描述】:

我经常看到人们使用 arity 0(无参数)生成新函数:

 spawn_link(fun function_name/0).

其中 function_name/0 可以是例如:

function_name() -> 
                   io:format("hello~n", []) 
end.

我可以以类似的方式生成一个带参数的函数吗?例如:

function_name(Arg) ->
                   io:format("hello ~p ~n", [Arg])
end.

我应该使用

spawn_link(Module, Function, Arg)

还是别的什么?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    您可以将 spawn_link 与参数一起使用,使用指定参数或仅使用固定参数构建 lambda 函数 (fun)。因此,例如,您可以使用,正如您所说,只是:

    spawn_link(Module, Function, Args).
    

    或在您的模块中导出您自己的spawn_link(或start):

    spawn_link(Args) ->
        spawn_link(?MODULE, fun myfun/X, Args).
    

    或使用fun:

    spawn_link(Args) ->
        spawn_link(fun () -> apply(fun myfun/X, Args) end).
    

    或者如果你在内部调用一些带有固定参数的函数:

    spawn_link() ->
        spawn_link(fun () -> myfun(1,2,3) end).
    

    在这种情况下,X 是每种情况下 myfun 函数的元数。

    【讨论】:

    • 第二个例子就是我要找的那个。我猜只是口味问题
    • 在生成 fun 时唯一需要注意的是 在哪里 事物被评估,在 fun 中的任何内容都不会被评估,直到它被调用,这将在新的过程。
    • 没错。这就是为什么你可以写:S = self(), spawn (fun () -> io:format("I am ~p called from ~p~n", [self(),S]) end)..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2020-02-28
    • 1970-01-01
    • 2021-01-20
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多