2

バイナリの可変ビット数の一致に問題があります。バイナリの最初の数ビットを抽出するために、次のおもちゃの例に絞り込みました。

f(<<H:Bits, _/binary>>, Bits) ->
    H.

コンパイラ(R15B01)が教えてくれvariable 'Bits' is unboundます。一方、これはうまくいきます:

f(X, Bits) ->
    <<H:Bits, _/binary>> = X,
    H.

そして、それは私が期待することを実行します。たとえばf(<<1,2,3,4>>, 8)、1 が返され、f(<<1,2,3,4>>, 16)258 が返されます。

最初のフォームが機能しないのはなぜですか? 対等でいいのではないですか?

4

1 に答える 1

4

最初の例でf(<<H:Bits, _/binary>>, Bits) -> Hは、変数 Bits は以前にバインドされていません。最初と 2 番目の引数パターンの両方で発生しますが、特定の順序で一致しないため、バイナリ内の Bits はバインドされていないと見なされます。2 番目の例ではf(X, Bits) -> <<H:Bits, _/binary>> = X、 Bits は のマッチングが<<...>> = X始まる前にバインドされます。

最初の例は、「2 番目の引数で指定された数のビットを取得し、その数のビットをバイナリから H として抽出する」(目的) と読むことができますが、「ビットの任意の数のビットを取得する (おそらく可能な限り多く) をバイナリから H として取得し、2 番目の引数で渡された数値とたまたま同じ数値であることを確認します。」このあいまいさを避けるために、コンパイラはプログラムを拒否します。

于 2012-04-17T13:07:43.273 に答える