Я не знаю, какую перегрузку 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.

3
Bercovici Adrian 19 Авг 2019 в 16:27

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.

3
7stud 19 Авг 2019 в 16:40

Просто вставьте определение в удовольствие:

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

И тогда вы можете использовать A(YourParam).

4
Pascal 19 Авг 2019 в 14:27