2012-03-31 1 views
2

gen_serverでhandle_call機能は次のとおりです。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}. 

を?それは

ところで、私の頭の上だ:YUVレコードは次のとおりです。

foo(#bar{buz = Value} = Record) -> ... 

これは一般的です:

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

答えて

6

私が正しくあなたの質問を理解していれば、あなたは次のパターンが何をするのか理解していません関数の引数の全体と一部に対するパターンマッチングの方法。私の例では、変数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あり、その後返信が[]である場合には、第1のパターンが一致しました。 2番目は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};

関数の先頭の一致は、関数headで定義されたレコードをレコードState wh

と一致させるためのものです
関連する問題