2

gen_serverのhandle_call関数は次のとおりです。

Module:handle_call(Request, From, State) -> Result

しかし、私は次のような1つのhandle_call関数に遭遇します:</ p>

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

2 に答える 2

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し、その後、応答は[]です。2つ目は、関数によって返される値の他のすべてのケースと一致しdecoder、応答します。どちらの場合もState、変更されず、「そのまま」内部のgen_serverハンドラーに戻されます。

于 2012-03-31T10:12:02.280 に答える
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};

関数のヘッドでの一致は、まさに期待どおりです。関数のヘッドで定義されたレコードをレコードStatewhに一致させようとしているだけです。

于 2012-03-31T18:29:19.493 に答える