为啥我的 gen_server 不尊重模式匹配?
Posted
技术标签:
【中文标题】为啥我的 gen_server 不尊重模式匹配?【英文标题】: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=#statelimit=Limit,
ok,State.
handle_call(From,state,State)->
reply,State,State;
handle_call(From,Message,State=#stateprocessed=P,limit=L,counter=C)->
Reply=if C=:=L;C>L -> exit(consumed);
C<L -> processed,self(),os:timestamp(),Message
end,
reply,Reply,State#statecounter=C+1,processed=[Message,P].
handle_info(Message,State=#stateunknown=U)->
noreply,State#stateunknown=[Message|U].
调用:>gen_server:call(ServerRef,state)
也进入第二种模式。
【问题讨论】:
【参考方案1】:因为你有错误的参数顺序:它应该是Module:handle_call(Request, From, State)
。所以第一个模式只有在From
是state
时才会匹配。
【讨论】:
以上是关于为啥我的 gen_server 不尊重模式匹配?的主要内容,如果未能解决你的问题,请参考以下文章