用于固定字节长度位串的 Elixir typespec - Dialyzer 不满意
Elixir typespec for fixed byte length bitstring - Dialyzer not happy
我正在尝试创建一个表示固定长度的框架二进制数据包的类型规范。因此,使用固定 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 不喜欢这个吗?
::
后面的数字指定 位 的数量,而不是字节数。如果要类型匹配25个字节加N * 8个字节,则类型需要为:
@type my_type :: <<_::200, _::_*64>>
此更改后,您的原始表达式通过了 Dialyzer 的检查,但按预期增加 1 位或 1 字节的大小失败。
我正在尝试创建一个表示固定长度的框架二进制数据包的类型规范。因此,使用固定 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 不喜欢这个吗?
::
后面的数字指定 位 的数量,而不是字节数。如果要类型匹配25个字节加N * 8个字节,则类型需要为:
@type my_type :: <<_::200, _::_*64>>
此更改后,您的原始表达式通过了 Dialyzer 的检查,但按预期增加 1 位或 1 字节的大小失败。