Если я правильно понимаю ваш вопрос, вы не понимаете, что делает следующий шаблон:
foo(#bar{buz = Value} = Record) -> ...
Это распространенный способ сопоставления с целым и частью аргумента функции.В моем примере переменная Value
будет содержать значение поля buz
, а переменная Record
будет содержать значение всей записи.Это может быть применено в других случаях, таких как:
foo([Head|Tail] = List) -> ...
foo({First, Second} = Tuple) -> ...
и так далее.Вместо переменных вы можете использовать литералы, и тогда сопоставление с образцом будет успешным, только если тот же литерал появится в вызове.
В вашем примере:
handle_call(info, _From, #yuv{decoder = undefined} = State) ->
{reply, [], State};
handle_call(info, _From, #yuv{decoder = Decoder} = State) ->
{reply, av_decoder:info(Decoder), State};
handle_call(_Request, _From, State) ->
{noreply, ok, State}.
Первый шаблон соответствует, если1015 * значение поля undefined
, а затем ответ []
.Второй соответствует всем остальным случаям для decoder
и отвечает значением, возвращаемым функцией.В обоих случаях State
не изменяется и передается "как есть" внутренним обработчикам gen_server.