我开始使用 Erlang,并且在将返回的 PID 应用spawn/3
到process_info/1
方法时可以帮助理解不同的结果。
给定这个a/0
导出函数的简单代码,它只是调用b/0
等待消息的 :
-module(tester).
-export([a/0]).
a() ->
b().
b() ->
receive {Pid, test} ->
Pid ! alrighty_then
end.
...请帮助我了解 shell 输出不同的原因:
示例 1:
在这里,current_function
ofPid
显示为tester:b/0
:
Pid = spawn(tester, a, []).
process_info( Pid ).
> [{current_function,{tester,b,0}},
{initial_call,{tester,a,0}},
...
示例 2:
在这里,current_function
ofprocess_info/1
显示为tester:a/0
:
process_info( spawn(tester, a, []) ).
> [{current_function,{tester,a,0}},
{initial_call,{tester,a,0}},
...
示例 3:
在这里,current_function
ofprocess_info/1
显示为tester:a/0
,但current_function
ofPid
为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}},
...
不知道该怎么做。也许我只需要接受它高于我的工资等级!