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 之前未绑定 - 它同时出现第一个和第二个参数模式,但它们未按任何特定顺序匹配,因此二进制文件中的 Bits 被认为是未绑定的。在第二个示例中f(X, Bits) -> <<H:Bits, _/binary>> = X,Bits 在 的匹配<<...>> = X开始之前被绑定。

第一个示例可以读作“取第二个参数中给出的位数,并从二进制文件中提取那么多位作为 H”(你想要的),但也可以读作“获取任意数量的位(也许尽可能多的)从二进制作为 H,然后检查它是否恰好与第二个参数中传递的数字相同”。为了避免这种歧义,编译器拒绝该程序。

于 2012-04-17T13:07:43.273 回答