【问题标题】:Bit syntax: Default size in pattern matching?位语法:模式匹配中的默认大小?
【发布时间】:2017-06-29 11:14:10
【问题描述】:

根据 Programming Erlang(2nd),p 的底部。 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 docs 重申了 Programming Erlang(2nd) 中所述的相同规则:

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

【问题讨论】:

    标签: erlang


    【解决方案1】:

    好吧,既然我已经发布了文档中的引用,我注意到它说:

    在匹配中,这个默认值只对最后一个有效 元素。匹配中的所有其他 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(2nd) 中的任何内容都更清晰。所以在我看来应该重写文档,如下所示:

    4.4 默认值

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

    在构造中,默认大小取决于类型。对于整数,它是 8。对于浮点数,它是 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">>
    

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

    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
    

    我有这个权利吗?

    【讨论】:

    猜你喜欢
    • 2015-06-11
    • 2013-12-07
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多