【问题标题】:Erlang Undefined Function GlobalErlang 未定义函数全局
【发布时间】:2017-12-06 06:27:22
【问题描述】:

这是我第一次涉足 Erlang,但我来自 Prolog 世界。

我似乎无法理解为什么在加载模块并告诉它执行一个函数后,它似乎运行到另一个单独的函数。

Erlang - undefined function 的问题似乎相关,但似乎不适用于我的情况。我可以编译和加载模块。

这是我的 Eshell 输出:

Erlang/OTP 20 [erts-9.1] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10]

Eshell V9.1  (abort with ^G)
1> m(chat_client).
Module: chat_client
MD5: 32e278745489222df841e93620154031
Compiled: No compile time info available
Object file: h:/Program Files/erl9.1/bin/chat_client.beam
Compiler options:  []
Exports: 
         handle_messages/1
         module_info/0
         module_info/1
         register_nickname/1
         send_message/2
         start_router/0
         unregister_nickname/1
ok
2> chat_client:start_router().
yes
3> chat_client:register_nickname(myatom).
** exception error: undefined function global:send_message/2
4> l(chat_client).
{module,chat_client}
5> chat_client:start_router().           
ok
6> chat_client:register_nickname(myatom).
** exception error: undefined function global:send_message/2
7> l(message_router).                    
{module,message_router}
8> chat_client:start_router().           
ok
9> chat_client:register_nickname(myatom).
** exception error: undefined function global:send_message/2
10> 

在chat_client.erl文件中,没有匹配到send_message/2:

-module(chat_client).

-compile(export_all).

register_nickname(Nickname) ->
    Pid = spawn(chat_client, handle_messages, [Nickname]),
    message_router:register_nick(Nickname, Pid).

unregister_nickname(Nickname) ->
    message_router:unregister_nick(Nickname).

send_message(Addressee, MessageBody) ->
    message_router:send_chat_message(Addressee, MessageBody).

handle_messages(Nickname) ->
    receive
        { printmsg, MessageBody } ->
            io:format("~p received: ~p~n", [Nickname, MessageBody]),
            handle_messages(Nickname);
        stop ->
            ok
    end.

start_router() ->
message_router:start().

从相关文件 message_router.erl 我可以看到一个全局函数进行匹配(或者我认为):

send_chat_message(Addressee, MessageBody) ->
    global:send_message(?SERVER, { send_chat_msg, Addressee, MessageBody }).

register_nick(ClientName, ClientPid) ->
    global:send_message(?SERVER, { register_nick, ClientName, ClientPid }).

unregister_nick(ClientName) ->
    global:send_message(?SERVER, { unregister_nick, ClientName }).

在这种情况下我做错了什么?

【问题讨论】:

    标签: erlang message-passing


    【解决方案1】:

    在模块global中,有一个函数send/2,但没有send_message/2。将您的 message_router 更改为:

    send_chat_message(Addressee, MessageBody) ->
        global:send(?SERVER, { send_chat_msg, Addressee, MessageBody }).
    
    register_nick(ClientName, ClientPid) ->
        global:send(?SERVER, { register_nick, ClientName, ClientPid }).
    
    unregister_nick(ClientName) ->
        global:send(?SERVER, { unregister_nick, ClientName }).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 2014-12-08
      • 1970-01-01
      • 2017-12-11
      • 2022-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多