Эрланг: ракушка не возвращается после Спауна


-module(core_profile).

-export([start/0]).

start() ->
    register(eProfile, spawn(loop())),
    ok.

loop() ->
    receive
            {Key, Pid} -> Pid ! getKey();
            {name, Pid} -> Pid ! getName();
            {address, Pid} -> Pid ! getAddress()
    end,
    loop().

Это мой код

Когда я пытаюсь запустить петлю из оболочки, я застреваю.

2> Pid = spawn(fun()-> a end).     
<0.39.0>
3>c(core_profile.erl).
{ok, core_profile}
4>core_profile:start().

Разве команда не должна вернуть ok, а затем дать мне следующую командную строку вместо того, чтобы ничего не делать?

2 2

2 ответа:

Когда вы делаете spawn(loop()), функция loop вызывается для оценки результата (который будет передан в spawn, поэтому вы входите в бесконечный цикл.

Вместо вызова функции вы должны передать ссылку на функцию, выполнив spawn(fun loop/0).

spawn(Fun) -> pid()

Типы: Fun = function ()

Возвращает pid нового процесса, запущенного приложением Fun, в пустой список [].

Вы должны написать register(eProfile, spawn( fun()-> loop() end)),