1

このbson-erlangモジュールは、BSON でエンコードされた JSON を次のように変換します。

{ "salutation" : "hello",
  "subject" : "world" }

次のような Erlang タプルに変換します。

{ salutation, <<"hello">>, subject, <<"world">> }

今、私が話そうとしているサーバーは、これらのフィールドを任意の順序で配置できます。そこには、私が気にしない余分なフィールドがある可能性があります。したがって、同様に有効ですが、代わりに次のように表示される可能性があります。

{ subject, <<"world">>, salutation, <<"hello">>, reason, <<"nice day">> }

タプルの特定の部分を抽出する関数パターンを、その直前にある部分に基づいて指定する方法はありますか?

次のことを試してみると、タプルのアリティが間違っていて、気になるフィールドが正しい場所にないため、「一致する関数句がありません...」で失敗します。

handle({ salutation, Salutation, _, _ }) -> ok.

これは可能ですか?これを行うより良い方法はありますか?

4

2 に答える 2

0
T = { subject, <<"world">>, salutation, <<"hello">>, reason, <<"nice day">> },
L = size(T),
L1 = [{element(I,T),element(I+1,T)} || I <- lists:seq(1,L,2)].

[{subject,<<"world">>},
 {salutation,<<"hello">>},
 {reason,<<"nice day">>}]

proplists:get_value(salutation,L1).                           
<<"hello">>

オールインワンが必要な場合:

F = fun(Key,Tup) -> proplists:get_value(Key,[{element(I,Tup),element(I+1,Tup)} || I <- lists:seq(1,size(Tup),2)]) end.

F(reason,T).
<<"nice day">>
F(foo,T).
undefined
于 2013-10-09T13:27:37.777 に答える