如果在handle_call函数中有"record = State"会发生什么?

why*_*why 2 erlang gen-server

gen_server中的handle_call函数是:

Module:handle_call(Request, From, State) -> Result
Run Code Online (Sandbox Code Playgroud)

但是我遇到了一个这样的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}.
Run Code Online (Sandbox Code Playgroud)

我想知道发生了什么?它超越了我的头脑

BTW:yuv记录是:

-record(yuv, {
  host,
  name,
  media,
  decoder,
  consumer
}).
Run Code Online (Sandbox Code Playgroud)

aro*_*tav 6

如果我正确理解您的问题,您不明白以下模式的作用:

foo(#bar{buz = Value} = Record) -> ...
Run Code Online (Sandbox Code Playgroud)

这是模式匹配函数参数的整体和部分的常用方法.在我的例子中,变量Value将保存字段的值,buz变量Record将保存整个记录的值.这可以应用于其他情况,例如:

foo([Head|Tail] = List) -> ...
foo({First, Second} = Tuple) -> ...
Run Code Online (Sandbox Code Playgroud)

等等.您可以使用文字而不是变量,只有在调用中出现相同的文字时,模式匹配才会成功.

在你的例子中:

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}.
Run Code Online (Sandbox Code Playgroud)

如果decoder字段的值为undefined,则第一个模式匹配,然后回复[].第二个匹配所有其他情况,decoder并使用函数返回的值进行回复.在这两种情况下State都不会被修改,并且"按原样"传递回内部gen_server处理程序.