如何使用来自 erlang shell 的参数生成进程

How to spawn process with arguments from erlang shell

我不知道从 erlang shell 启动进程时要使用什么 spawn 重载,因为我需要传递参数。

A=spawn(
    fun(TID)-> 
           receive {FROM,MSG}->
                  FROM ! {self(),MSG}
           after 0 ->
                  TID !{self(),timeouted}
           end
   end,
   TID
  ).

只有 function 和参数没有重载。 从 shell 启动时的模块名称是什么?

我也试过:

A=spawn(?MODULE,fun()->....,TID).

P.S 在我的例子中,如您所见,我需要向 spawn 方法提供参数,而 运行 它直接来自 erlang shell.

只需将定义嵌入一个有趣的:

A = fun(X) ->
    TID = X,             
    spawn(      
        fun()->  
            receive {FROM,MSG}->          
                FROM ! {self(),MSG}    
            after 0 ->                    
                TID !{self(),timeouted}
            end                           
        end                                  
    )
end.

然后你可以使用 A(YourParam).

通常,您在模块中定义一个函数:

-module(a).
-compile(export_all).

go(X)-> 
    receive {From, Msg}->
        From ! {self(), Msg}
    after 0 ->
        io:format("~s~n", [X])
    end.

然后这样做:

9> c(a).                         
a.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,a}

10> Pid = spawn(a, go, ["hello"]).
hello
<0.95.0>

在 shell 中定义函数太麻烦了。

回复评论:

以下是在 erlang 中进行简单测试的方法:

-module(a).
-compile(export_all).
-include_lib("eunit/include/eunit.hrl").

do(Y) ->
    Y.

go(X)-> 
    receive {From, Msg}->
        From ! {self(), Msg}
    after 0 ->
        X
    end.

do_test() ->
    10 = do(10).
go_test() ->
    "hello" = go("hello").

在shell中:

1> c(a).

2> a:test().
  2 tests passed.
ok

测试失败时会发生以下情况:

5> a:test().
a: go_test...*failed*
in function a:go_test/0 (a.erl, line 18)
**error:{badmatch,"hello"}
  output:<<"">>

=======================================================
  Failed: 1.  Skipped: 0.  Passed: 1.
error

6> 

您甚至不需要使用 eunit,因为您可以简单地执行以下操作:

go_test() ->
    "hello" = go("hello").

然后在 shell:

1> c(a).
a.erl:2: Warning: export_all flag enabled - all functions will be exported

2> a:go_test().

如果 go("hello") 不是 return,您将收到错误匹配错误 "hello":

** exception error: no match of right hand side value "hello" in function a:go_test/0 (a.erl, line 18)

使用eunit的好处是只需要一条命令a:test(),就可以执行模块中所有以_test.

结尾的函数