如何使用来自 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
.
结尾的函数
我不知道从 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
.