位语法:模式匹配中的默认大小



根据编程Erlang(第2版),第103页底部:

Size的值指定段的大小。默认值取决于类型。对于整数为8、对于浮点为64,对于二进制,它是二进制的大小在模式匹配中,此默认值仅对最后一个元素有效

下面的例子不是反驳了"模式匹配中的最后一个元素是唯一可以使用默认大小的元素"的规则吗:

1> Bin = <<97, 98, 99>>.
<<"abc">>
2> <<X/integer, Rest/binary>> = Bin.  %Employs default Size for integer.
<<"abc">>
3> X.
97
4> Rest.
<<"bc">>

erlang文档重申了在编程erlang(第二):中所述的相同规则

4.4默认值


默认大小取决于类型。对于整数,它是8。用于浮子它是64。对于二进制,它是所有二进制在匹配中默认值仅对最后一个元素有效所有其他匹配中的二进制元素必须具有大小规范。

好吧,现在我已经发布了文档中的报价,我注意到上面写着:

在匹配中,此默认值仅对最后一个有效要素匹配中的所有其他binary元素都必须具有大小规格

事实上,我在这里确实得到了一个错误:

7> f().
ok
8> Bin = <<97, 98, 99>>.            
<<"abc">>
9> <<B/binary, X/integer>> = Bin.   
* 1: a binary field without size is only allowed at the end of a binary pattern

那里的错误消息比文档和Programming Erlang(第二版)中的任何内容都清楚。所以在我看来,文档应该被重写,比如这样:

4.4默认

[省略开头:<<3.14>>甚至不是合法语法。]

在构造中,默认的"大小"取决于类型。对于整数,它是8。对于float,它是64。对于二进制,它是指定二进制:

1> Bin = << <<97, 98, 99>>/binary, 17/integer, 3.2/float >>.  
<<97,98,99,17,64,9,153,153,153,153,153,154>>
|<------>| ^|<-------------------------->|
binary=24 |           float=64  
|        
integer=8
2> size(Bin). % Returns the number of bytes:
12            % 3*8 bits + 8 bits + 64 bits = 96 bits => 96/8 = 12 bytes

在匹配中,只有在模式末尾才允许使用没有显式Size的二进制段,其默认Size是比赛右侧的二进制:

25> Bin = <<97, 98, 99>>.
<<"abc">>
26> << X/integer, Rest/binary >> = Bin.
<<"abc">>
27> X.
97
28> Rest.
<<"bc">>

模式中具有二进制类型的所有其他段必须指定Size:

12> Bin = <<97, 98, 99, 100>>.         
<<"abcd">>
13> << B:1/binary, X/integer, Rest/binary >> = Bin. %'unit' defaults to 8 for  
<<"abcd">>                    %binary type, total segment size is Size * unit  
14> B.
<<"a">>
15> X.
98
16> Rest.
<<"cd">>
17> << B2/binary, X2/integer, Rest2/binary >> = Bin. 
* 1: a binary field without size is only allowed at the end of a binary pattern

我有这个权利吗?