Elixir typespec用于固定字节长度bitstring - Dialyzer不高兴

时间:2018-06-06 20:35:32

标签: elixir bitstring dialyzer

我试图创建一个表示固定长度成帧二进制数据包的typespec。因此,使用固定N 字节的比特串(例如25)似乎是正确的想法。

Elixir typespec文档声明如下:

                                ## Bitstrings
| <<>>                          # empty bitstring
| <<_::size>>                   # size is 0 or a positive integer
| <<_::_*unit>>                 # unit is an integer from 1 to 256
| <<_::size, _::_*unit>>

从这里我可以假设你可以使用@spec my_type ::&lt; _ :: 25,_ :: _ * 8&gt;&gt;

@type my_type :: <<_::25, _::_*8>>

@spec my_type_test() :: my_type
def my_type_test() do
    # 25 byte bitstring with start-of-frame byte
    << 0xA5::size(8) , 0::size(24)-unit(8) >>
end

但Dialyzer回复了以下内容:

[ElixirLS Dialyzer] Invalid type specification for function 
'TestModule':my_type_test/0. The success typing 
is () -> <<_:200>>

咦?但它们都是位串,位长是一样的!

有人知道为什么Dialyzer不喜欢这个吗?

1 个答案:

答案 0 :(得分:1)

::之后的数字指定了的数量,而不是字节。如果希望类型匹配25个字节加上N * 8个字节,则类型必须为:

@type my_type :: <<_::200, _::_*64>>

在此更改之后,原始表达式会传递Dialyzer的检查,并按预期将大小增加1位或1字节失败。