2016-01-10 5 views
5

ビットごとにビット列を構成する方法を探していますが、これを行う方法が不思議です。ビットストリングの最後にビットを連結する方法は?

私はそうのような2つのバイトを連結に類似する構文を期待していた。

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

だから私は試してみました:

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

が可能、このですか?前もって感謝します。

答えて

12

バグかどうかは正確には分かりませんが、何が起こっているのかを調べて、後で心配してみましょう。

<>とは?それはKernel.<>/2で定義された単なるマクロであることがわかります。それらをより良く理解するためにマクロで何ができますか?それらを展開する!

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

通常のバイナリ構文には、<>があります。残念なことに私たちにとっては、引数がバイナリであることを前提としています!私たちはビットストリングを持っています - したがってエラーです。それを修正するには?期待どおりに動作

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

:私たちは、直接、通常のバイナリ/ビット列の構文を使用することができます。

編集:私はこれをフォローアップしました。この現象は予期されています。 <>オペレータは、ビットストリングではなくバイナリで動作するように設計されています。エラーはむしろ不快ですが、Erlangの中から深く入ってきています。

+0

ありがとうございました!私はその道を歩み始めましたが、あなたが私を得た場所に行くスキルを持っていませんでした。再度、感謝します! – djdrzzy

関連する問題