Что произошло, если в функции handle_call есть «record = State»? - PullRequest
2 голосов
/ 31 марта 2012

Функция 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
}).

Ответы [ 2 ]

6 голосов
/ 31 марта 2012

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

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.

1 голос
/ 31 марта 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

...