【发布时间】:2011-09-19 01:45:48
【问题描述】:
我刚开始使用 Erlang,在将 spawn/3 返回的 PID 应用于 process_info/1 方法时,可以帮助理解不同的结果。
给定这个导出a/0函数的简单代码,它只是调用b/0,它等待消息:
-module(tester).
-export([a/0]).
a() ->
b().
b() ->
receive {Pid, test} ->
Pid ! alrighty_then
end.
...请帮助我了解 shell 输出不同的原因:
示例 1:
这里,Pid 中的current_function 显示为tester:b/0:
Pid = spawn(tester, a, []).
process_info( Pid ).
> [{current_function,{tester,b,0}},
{initial_call,{tester,a,0}},
...
示例 2:
这里,process_info/1 中的current_function 显示为tester:a/0:
process_info( spawn(tester, a, []) ).
> [{current_function,{tester,a,0}},
{initial_call,{tester,a,0}},
...
示例 3:
这里,process_info/1 的current_function 显示为tester:a/0,但Pid 的current_function 是tester:b/0:
process_info( Pid = spawn(tester, a, []) ).
> [{current_function,{tester,a,0}},
{initial_call,{tester,a,0}},
...
process_info( Pid ).
> [{current_function,{tester,b,0}},
{initial_call,{tester,a,0}},
...
我假设在调用 spawn/3 时在后台发生了一些异步代码,但是变量赋值和参数传递如何工作(尤其是在最后一个示例中)使得 Pid 获得一个值,而 process_info/1 获得另一个?
Erlang 中有什么特别的东西可以在这种情况下绑定变量赋值,但没有为参数传递提供这种绑定?
编辑:
如果我使用这样的函数:
TestFunc = fun( P ) -> P ! {self(), test}, flush() end.
TestFunc( spawn(tester,a,[]) ).
...消息从tester:b/0正确返回:
Shell got alrighty_then
ok
但是如果我使用这样的函数:
TestFunc2 = fun( P ) -> process_info( P ) end.
TestFunc2( spawn(tester,a,[]) ).
...process_info/1 仍然显示tester:a/0:
[{current_function,{tester,a,0}},
{initial_call,{tester,a,0}},
...
不知道该怎么做。也许我只需要接受它高于我的工资等级!
【问题讨论】:
标签: erlang argument-passing variable-assignment spawn