Типы эликсира для цепочки битов фиксированной длины - Диализатор не рад - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь создать typepec, представляющий двоичный пакет с фиксированной длиной.Поэтому использование цепочки битов с фиксированными N байтами (скажем, например, 25) казалось правильной идеей.

В документации по типам спецификаций Elixir указано следующее:

                                ## 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 это не нравится?

1 Ответ

0 голосов
/ 06 июня 2018

Число сразу после :: указывает количество битов , а не байтов.Если вы хотите, чтобы тип совпадал с 25 байтами плюс N * 8 байтов, тип должен быть:

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

После этого изменения ваше оригинальное выражение проходит проверки Dialyzer и увеличивает размер на 1 бит или 1 байт.терпит неудачу, как и ожидалось.

...