在阅读 Erlang 和 OTP 的实际操作时,我遇到了一些奇怪的语法,这些语法与我难以理解的记录有关。我希望有人可以在这里澄清句柄信息中发生的超时情况:
handle_info({tcp, Socket, RawData}, State) ->
do_rpc(Socket, RawData),
RequestCount = State#state.request_count,
{noreply, State#state{request_count = RequestCount + 1}};
handle_info(timeout, #state{lsock = LSock} = State) ->
{ok, _Sock} = gen_tcp:accept(LSock),
{noreply, State}.
具体来说,我不太确定这里发生了什么:
#state{lsok = LSock} = State
这似乎是某种反向分配?您是否有效地说第二个参数将是#state 记录,将 lsock 值分配给 LSock 变量并将整个记录分配给 State?我只是从接下来两行中变量的使用方式推断出这一点,但这种语法似乎很奇怪。
[编辑]
我在 shell 中对模式匹配和分配进行了更多测试,但它没有按我预期的那样工作:
2> 1 = A.
* 1: variable 'A' is unbound
3> A = 1.
1
4> {1,2}.
{1,2}
5> {1,2} = B.
* 1: variable 'B' is unbound
然后我运行了这个测试函数,看看它是否只是在匹配函数参数:
test_assignment(A = {X,Y},{W,X} = B) ->
io:format("Variable A is ~p~n",[A]),
io:format("Variable B is ~p~n",[B]).
24> c(test).
test.erl:21: Warning: variable 'W' is unused
test.erl:21: Warning: variable 'Y' is unused
{ok,test}
25> test:test_assignment({1,2},{3,4}).
** exception error: no function clause matching test:test_assignment({1,2},{3,4}) (test.erl, line 21)