Читая Erlang и OTP в действии, я наткнулся на какой-то странный синтаксис в отношении записей, который мне трудно понять. Я надеюсь, что кто-то может прояснить, что происходит в handle_info для тайм-аутов здесь:
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? Я просто делаю вывод из того, как переменные используются в следующих двух строках, но такой синтаксис кажется странным.
[РЕДАКТИРОВАТЬ]
Я провел еще несколько тестов сопоставления с образцом и присваивания в оболочке, и он не работает так, как я ожидал:
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)