我想逐点构造一个字符串,我想知道如何这样做.
我期待语法类似于连接两个字节,如下所示:
iex(1)> <<1>> <> <<1>> <<1, 1>>
所以我尝试过:
iex(2) <<1::1>> <> <<1::1>> ** (ArgumentError) argument error
这可能吗?提前致谢.
我不确定它是否是一个错误,但让我们探索一下发生了什么,并在以后担心.
什么是<>
?事实证明它只是一个定义的宏Kernel.<>/2
.我们可以用宏来更好地理解它们?扩大他们!
quote(do: <<1::1>> <> <<1::1>>) |> Macro.expand(__ENV__) |> Macro.to_string #=> "<<(<<1::1>>::binary), (<<1::1>>::binary)>>"
我们可以看到<>
desugars到正常的二进制语法.对我们来说不幸的是它假设它的参数是二进制文件!我们有位串 - 因此错误.怎么解决?我们可以直接使用常规的binary/bitstring语法:
<< <<1::1>>::bitstring, <<1::1>>::bitstring >> #=> <<3::size(2)>>
哪个按预期工作.
编辑:我跟进了这个.此行为是预期的.<>
运算符旨在处理二进制而不是位串.错误是相当不愉快的,但它在Erlang内部深入.