Erlang 二进制位的参数匹配

Erlang 二进制位的参数匹配,erlang,Erlang,我在匹配二进制文件中的可变位数时遇到了一个问题,我将其缩小到以下玩具示例中,以提取二进制文件的前几位: f(<<H:Bits, _/binary>>, Bits) -> H. 它实现了我所期望的,例如f(,8)产生1,而f(,16)产生258 为什么第一张表格不起作用?它是否应该是等价的?在您的第一个示例中,f(,Bits)->H,变量位之前没有绑定-它出现在第一个和第二个参数模式中,但它们没有按任何特定顺序匹配,因此二进制中的位被认为是未绑定的。在第二个

我在匹配二进制文件中的可变位数时遇到了一个问题,我将其缩小到以下玩具示例中,以提取二进制文件的前几位:

f(<<H:Bits, _/binary>>, Bits) ->
    H.
它实现了我所期望的,例如
f(,8)
产生1,而
f(,16)
产生258


为什么第一张表格不起作用?它是否应该是等价的?

在您的第一个示例中,
f(,Bits)->H
,变量位之前没有绑定-它出现在第一个和第二个参数模式中,但它们没有按任何特定顺序匹配,因此二进制中的位被认为是未绑定的。在第二个示例中,
f(X,Bits)->=X
,在开始匹配
=X
之前,位被绑定


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

在您的第一个示例中,
f(,Bits)->H
,变量位之前没有绑定-它出现在第一个和第二个参数模式中,但它们没有按任何特定顺序匹配,因此二进制中的位被认为是未绑定的。在第二个示例中,
f(X,Bits)->=X
,在开始匹配
=X
之前,位被绑定


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

位语法中的所有大小表达式都必须绑定。中的第二个参数在匹配第一个参数之前未绑定,颠倒顺序不会改变这一点。看起来参数是独立匹配的。位语法中的所有大小表达式都必须绑定。中的第二个参数在匹配第一个参数之前未绑定,颠倒顺序不会改变这一点。看起来参数是独立匹配的。
f(X, Bits) ->
    <<H:Bits, _/binary>> = X,
    H.