为什么我的 gen_server 不遵守模式匹配?
Why is my gen_server not respecting pattern matching?
你好,我想弄清楚为什么我的 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]}}.
通话中:
>gen_server:call(ServerRef,state)
也进入第二个模式
因为你的参数顺序错误:应该是Module:handle_call(Request, From, State)
。所以第一个模式只会在 From
是 state
.
时匹配
你好,我想弄清楚为什么我的 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]}}.
通话中:
>gen_server:call(ServerRef,state)
也进入第二个模式
因为你的参数顺序错误:应该是Module:handle_call(Request, From, State)
。所以第一个模式只会在 From
是 state
.