【问题标题】:Why is my gen_server not respecting pattern matching?为什么我的 gen_server 不尊重模式匹配?
【发布时间】:2020-09-02 10:16:48
【问题描述】:

您好,我想弄清楚为什么我的 gen_server 实现不尊重模式匹配:

如果我运行gen_server:call(ServerRef,state),它会进入handle_call 的第二个模式,我不明白为什么,因为第一个模式应该会被命中。
发送atoms 时有问题吗?

模块

-module(wk).
-behaviour(gen_server).
-compile(export_all).


-record(state,{
   limit,
   processed=[],
   unknown=[],
   counter=0
}).
start_link(Limit)->
   gen_server:start_link(?MODULE, Limit, []).

start(Limit)->
    gen_server:start(?MODULE,Limit,[]).
init(Limit)->
    State=#state{limit=Limit},
    {ok,State}.


handle_call(From,state,State)->
    {reply,State,State};
handle_call(From,Message,State=#state{processed=P,limit=L,counter=C})->
     Reply=if C=:=L;C>L -> exit(consumed);
              C<L       -> {{processed,self(),os:timestamp()},Message}
     end,
    {reply,Reply,State#state{counter=C+1,processed=[Message,P]}}.

handle_info(Message,State=#state{unknown=U})->
    {noreply,State#state{unknown=[Message|U]}}.

调用:
&gt;gen_server:call(ServerRef,state)也进入第二种模式。

【问题讨论】:

    标签: erlang pattern-matching gen-server


    【解决方案1】:

    因为你有错误的参数顺序:它应该是Module:handle_call(Request, From, State)。所以第一个模式只有在Fromstate 时才会匹配。

    【讨论】:

      猜你喜欢
      • 2015-04-04
      • 2021-09-21
      • 2015-09-17
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多