Я не знаю, какую перегрузку spawn
использовать при запуске процесса из оболочки erlang, поскольку мне нужно передавать аргументы.
A=spawn(
fun(TID)->
receive {FROM,MSG}->
FROM ! {self(),MSG}
after 0 ->
TID !{self(),timeouted}
end
end,
TID
).
Нет перегрузки только для function
и аргументов. Как называется модуль при запуске из оболочки?
Я также пробовал:
A=spawn(?MODULE,fun()->....,TID).
< Сильный > P.S В моем случае, как вы можете видеть, мне нужно предоставить аргументы методу spawn
, одновременно запуская его непосредственно из оболочки erlang.
2 ответа
Как правило, вы определяете функцию в модуле:
-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>
Определение функций в оболочке - слишком большая боль в заднице.
Ответ на комментарий:
Вот как вы можете сделать простое тестирование в 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").
В оболочке:
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").
Тогда в оболочке:
1> c(a).
a.erl:2: Warning: export_all flag enabled - all functions will be exported
2> a:go_test().
Вы получите ошибку неверного соответствия, если go("hello")
не вернет "hello"
:
** ошибка исключения: нет совпадения правого значения "привет" в функции a: go_test / 0 (a.erl, строка 18)
Преимущество использования eunit состоит в том, что с помощью одной команды a:test()
вы можете выполнять все функции в модуле, заканчивающиеся на _test
.
Просто вставьте определение в удовольствие:
A = fun(X) ->
TID = X,
spawn(
fun()->
receive {FROM,MSG}->
FROM ! {self(),MSG}
after 0 ->
TID !{self(),timeouted}
end
end
)
end.
И тогда вы можете использовать A(YourParam)
.
Похожие вопросы
Новые вопросы
erlang
Erlang - это универсальный язык программирования и среда выполнения со сборщиком мусора, со встроенной поддержкой параллелизма, распределения и отказоустойчивости.