Что произойдет, если в функции handle_call будет запись = состояние?

Функция handle_call в gen_server:

Module:handle_call(Request, From, State) -> Result

Но я встречаю одну функцию handle_call, подобную этой:

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}.

Я хочу знать, что случилось? Это выше моей головы

Кстати: запись yuv:

-record(yuv, {
  host,
  name,
  media,
  decoder,
  consumer
}).

person why    schedule 31.03.2012    source источник


Ответы (2)


Если я правильно понял ваш вопрос, вы не понимаете, что делает следующий шаблон:

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}.

Первый шаблон соответствует, если значение поля decoder равно undefined, а ответ равен []. Второй соответствует всем остальным случаям для decoder и отвечает значением, возвращаемым функцией. В обоих случаях State не изменяется и передается "как есть" обратно внутренним обработчикам gen_server.

person aronisstav    schedule 31.03.2012

если запись yuv определяется как:

-record(yuv, { decoder, foo, bar, baz }).

форма:

handle_call(info, _From, #yuv{decoder = undefined} = State) -> {reply, [], State};

это просто сахар для:

handle_call(info, _From, {yuv, undefined, _, _, _} = State) -> {reply, [], State};

совпадение в заголовке функции именно то, что вы ожидаете, оно просто пытается сопоставить запись, определенную в заголовке функции, с записью State wh

person ArgumentError    schedule 31.03.2012