Сопоставление с образцом и понимание списка с двоичным - PullRequest
0 голосов
/ 24 апреля 2018

Используя списочное понимание, эликсир позволяет выполнять сопоставление с шаблоном так:

iex()> for {a,2,c} = ch <- [{1,2,3},{4,5,6},3,4,5], do: c 
[3]

Но когда я пытаюсь сделать что-то подобное с двоичным файлом, у меня не получается:

iex()> for  << b1::size(2), b2::size(3), b3::size(3) >> = <<ch>> <- 'hello', do: b1 
[]

Тем не менее, он хорошо сочетается в автономном режиме:

<< b1::size(2), b2::size(3), b3::size(3) >> = <<100>>
"d"
iex(282)> b2
4
iex(283)> b1
1
iex(284)> b3
4

Это также хорошо работает, когда я передаю условие соответствия материалов в качестве параметра secornd в for:

iex(286)> for ch <- 'hello', << b1::size(2), b2::size(3), b3::size(3) >> = <<ch>>,  do: b1
[1, 1, 1, 1, 1]

Мне интересно, можно ли сделать что-то вроде первого примера с двоичным файлом.

1 Ответ

0 голосов
/ 24 апреля 2018

Это то, что терпит неудачу:

<<ch>> <- 'hello'

В вашем первом примере вы делаете var <- list, а позже вы пытаетесь <<var>> <- list, что не всегда одно и то же.


'hello' - это список целых чисел в первую очередь.Проверьте это:

[104,101,108,108,111]
#⇒ 'hello'

Kernel.SpecialForms.for/1 означает итерацию по списку, один за другим.Нельзя сопоставить двоичное число с целым числом, как:

<<_::size(2), _::size(3), _::size(3)>> = 101
#⇒ ** (MatchError) no match of right hand side value: 101

А также:

<<ch>> = 101
#⇒ ** (MatchError) no match of right hand side value: 101

Последний пример кода из вашего вопроса работает, потому что вы соответствуете целому числу, а затем явным образом сообщите Elixir / Erlang , что его следует рассматривать как двоичный файл, обернув его в << >>:

<<b1::size(2), _::size(3), _::size(3)>> = <<101>>
#⇒ "e"
...