掌握Erlang消息

掌握Erlang消息,erlang,Erlang,我仍在努力处理Erlang消息,在处理它的同时,我提出了这个案例。看起来它应该可以工作,但它只是无限期地挂起 能不能请更习惯Erlang的人解释一下我做错了什么?是的,我知道我甚至不看被退回的东西。这是试图减少代码以隔离问题的结果 -module(test). -export([caller/2]). callee(V1, V2, From) -> From ! {V1, V2}. caller(V1, V2) -> spawn(fun() -> calle

我仍在努力处理Erlang消息,在处理它的同时,我提出了这个案例。看起来它应该可以工作,但它只是无限期地挂起

能不能请更习惯Erlang的人解释一下我做错了什么?是的,我知道我甚至不看被退回的东西。这是试图减少代码以隔离问题的结果

-module(test).
-export([caller/2]).

callee(V1, V2, From) ->
  From ! {V1, V2}.

caller(V1, V2) ->
  spawn(fun() ->
    callee(V1, V2, self()) end),
  receive
    _ ->
      {V1, V2}
  end.
1> Self = self(), spawn(fun() -> io:format("Self: ~p, self():~p ~n", [Self, self()]) end).
Self: <0.83.0>, self():<0.85.0> 
<0.85.0>

如果将
self()
的结果分配给
spawn
调用中函数外部的变量,然后传入该变量而不是文本
self()
,则
被调用方
中发送的消息将正确发送到运行
调用方
的进程(等待
接收的进程
).

此位将帮助您了解问题所在

-module(test).
-export([caller/2]).

callee(V1, V2, From) ->
  From ! {V1, V2}.

caller(V1, V2) ->
  spawn(fun() ->
    callee(V1, V2, self()) end),
  receive
    _ ->
      {V1, V2}
  end.
1> Self = self(), spawn(fun() -> io:format("Self: ~p, self():~p ~n", [Self, self()]) end).
Self: <0.83.0>, self():<0.85.0> 
<0.85.0>
1>Self=Self(),spawn(fun()->io:format(“Self:~p,Self():~p~n,[Self,Self()])结束)。
Self:,Self():

尝试将调用移动到衍生进程之外的
self()
。谢谢,这非常有意义!你能把这个作为回答吗?