为什么下面列出了两种产卵方法之间的区别?
1> G = fun(X) -> io:format("~p ", [X]) end.
#Fun<erl_eval.44.97283095>
2> [spawn(fun() -> G(X) end) || X <- [1, 2, 3] ].
1 2 3 [<0.82.0>,<0.83.0>,<0.84.0>]
3> [spawn(fun() -> fun(X) -> io:format("~p ", [X]) end end) || X <- [1, 2, 3] ].
[<0.86.0>,<0.87.0>,<0.88.0>]
4>
Run Code Online (Sandbox Code Playgroud)
在最后一个示例中,这是生成的函数:
fun() ->
fun(X) -> io:format("~p ", [X]) end
end
Run Code Online (Sandbox Code Playgroud)
它实际上什么都不做——它创建了一个匿名函数但不调用它。
要调用该函数,您需要执行以下操作:
fun() ->
TheFunction = fun(Y) -> io:format("~p ", [Y]) end,
TheFunction(X)
end
Run Code Online (Sandbox Code Playgroud)
(为了清楚起见,我将参数名称从X更改Y为 。这并不重要,因为函数参数掩盖了外部作用域中的变量。)
或者将它装回单衬里:
4> [spawn(fun() -> TheFunction = fun(Y) -> io:format("~p ", [Y]) end, TheFunction(X) end) || X <- [1, 2, 3] ].
1 2 3 [<0.94.0>,<0.95.0>,<0.96.0>]
Run Code Online (Sandbox Code Playgroud)
现在它的行为与另一个示例相同。