Конкатенация цепочек в эликсире - PullRequest
0 голосов
/ 29 июня 2018

Этот фрагмент кода выдает ошибку:

 iex(35)> a = <<18::size(7)>>
     <<18::size(7)>>
 iex(36)> b = <<100::size(7)>>
     <<100::size(7)>>
 iex(37)> <<a <> b>>
     ** (ArgumentError) argument error

Почему этот код не работает?

Как я могу объединить цепочки битов, используя переменные?

(я обновил пример согласно замечаниям мудасобвы)

Ответы [ 2 ]

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

Правильный ответ - использовать подсказку типа bitstring:

iex(35)> a = <<18::size(7)>>
         <<18::size(7)>>
iex(36)> b = <<100::size(7)>>
         <<100::size(7)>>
iex(37)> <<a <> b>>
         ** (ArgumentError) argument error
iex(37)> <<a,  b>>
         ** (ArgumentError) argument error
iex(37)> <<a::bitstring,  b::bitstring>>
         <<37, 36::size(6)>>
0 голосов
/ 29 июня 2018

Как я могу объединить цепочки битов, используя переменные?

Если у вас есть двоичные файлы, используйте Kernel.<>/2:

iex|1 ▶ a = <<1, 2>>
#⇒ <<1, 2>>
iex|2 ▶ b = <<3, 4>>
#⇒ <<3, 4>>
iex|3 ▶ a <> b
#⇒ <<1, 2, 3, 4>>

Он также работает внутри Kernel.SpecialForms.<<>>/1:

iex|4 ▶ << a <> <<3, 4>> >>
#⇒ <<1, 2, 3, 4>>

В качестве альтернативы вы можете явно указать компилятору, что вы используете бинарный файл:

iex|5 ▶ << a :: binary, <<3, 4>> >>   
#⇒ <<1, 2, 3, 4>>

Если у вас есть цепочки битов, последний вариант работает: используйте явную подсказку типа:

iex|6 ▶ a = <<18::size(7)>>
iex|7 ▶ << a :: bitstring, <<100::size(7)>> >>
#⇒ <<37, 36::size(6)>>
...