如何将一些位连接到位串的末尾?

时间:2016-01-10 21:23:30

标签: elixir

我希望一点一点地构建一个字符串,我想知道如何这样做。

我希望语法类似于连接两个字节,如下所示:

iex(1)> <<1>> <> <<1>>
<<1, 1>>

所以我试过了:

iex(2) <<1::1>> <> <<1::1>>
** (ArgumentError) argument error

这可能吗?提前谢谢。

1 个答案:

答案 0 :(得分:13)

我不确定它是否是一个错误,但让我们探索一下发生了什么,然后再担心。

什么是<>?事实证明它只是Kernel.<>/2中定义的宏。我们可以用宏来更好地理解它们?扩展它们!

quote(do: <<1::1>> <> <<1::1>>) 
|> Macro.expand(__ENV__) 
|> Macro.to_string
#=> "<<(<<1::1>>::binary), (<<1::1>>::binary)>>"

我们可以看到<>对正常的二进制语法有所了解。对我们来说不幸的是它假设它的参数是二进制文件!我们有位串 - 因此错误。怎么解决?我们可以直接使用常规的binary / bitstring语法:

<< <<1::1>>::bitstring, <<1::1>>::bitstring >>
#=> <<3::size(2)>>

按预期工作。

编辑:我对此进行了跟进。此行为是预期的。 <>运算符旨在处理二进制而不是位串。错误是相当令人不愉快的,但它在Erlang内部深入。