连接Elixir中的位串

时间:2018-06-29 14:27:27

标签: elixir binary-data

这段代码抛出错误:

 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

为什么此代码失败?

如何使用变量连接位串?

(我根据mudasobwa的评论更新为示例)

2 个答案:

答案 0 :(得分:2)

  

如何使用变量连接位串?

如果您有二进制文件,请使用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)>>

答案 1 :(得分:1)

正确的答案是使用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)>>