0

我正在尝试创建一个表示固定长度框架二进制数据包的类型规范。因此,使用固定 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 :: <_::25, _::_*8>>

@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 不喜欢这个吗?

4

1 回答 1

1

紧随其后::的数字指定位数,而不是字节数。如果您希望类型匹配 25 字节加 N * 8 字节,则类型需要为:

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

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

于 2018-06-06T20:49:34.593 回答