簡體   English   中英

Erlang函數調用 - 為什么調用self()作為直接參數不起作用?

[英]Erlang function calls - Why does it not work to call self() as a direct argument?

當我們意識到這是問題時,我和我的朋友試圖在我們的代碼中找到一個錯誤。

random_function(spawn_link(fun() -> worker(List, self(), Death) end));

這是解決方案:

PID = self(),
random_function(spawn_link(fun() -> worker(List, PID, Death) end));

所以我的問題是,為什么不能直接調用self()函數呢? 是因為它是一個匿名函數還是某種特殊的Erlang?

它有點微妙。 self()調用發生在fun()內部。 由於它產生了它,它有另一個Pid而不是你期望的Pid。 因此,語義是不同的。

你應該知道spawn_link(fun() -> worker(List, self(), Death)會創建一個新進程,我們只稱它為Pid1 ,然后self()代表Pid1

在第二種情況下,你可以在spawn函數之外的Pid = self() ,所以self() Pid

當您spawn/spawn_link一個fun那么的身體fun的新工藝進行評估,而不是在產卵過程。 這就是你的第一種情況,在新進程中評估self()調用,因此它不會返回你想要的值,即產生進程的pid。 但是,在第二種情況下,首先在產生過程中評估self() ,然后將該pid傳遞給新過程,這就是您想要的。

這實際上是一個常見的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM