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)
如果我正确理解您的问题,您不明白以下模式的作用:
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处理程序.