2012-03-31 35 views
2

的handle_call功能gen_server是:如果handle_call函数中存在“record = State”,会发生什么情况?

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

我想知道发生了什么事?这是在我头上

BTW:将YUV记录是:

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

回答

6

如果我正确理解你的问题,你有什么不明白下面的模式做:

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处理程序。

1

如果记录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

相关问题