私はErlangを使い始めておりspawn/3
、process_info/1
メソッドに返されたPIDを適用するときにさまざまな結果を理解するのに少し役立つかもしれません。
関数がエクスポートされるこの単純なコードを考えると、メッセージを待機するをa/0
呼び出すだけです。b/0
-module(tester).
-export([a/0]).
a() ->
b().
b() ->
receive {Pid, test} ->
Pid ! alrighty_then
end.
...シェルからの出力が異なる理由を理解するのを手伝ってください:
例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
1つの値を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}},
...
これらすべてをどうすればよいかわからない。たぶん、私はそれを私の賃金等級を超えているとして受け入れる必要があります!