2016-01-10 5 views
5

Sto cercando di costruire una stringa un po 'alla volta e mi sto chiedendo come farlo.Come concatenare un bit alla fine di una stringa di bit?

mi aspettavo la sintassi per essere simile a concatenare due byte in questo modo:

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

Così ho provato:

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

è possibile? Grazie in anticipo.

risposta

12

Non sono esattamente sicuro se si tratta di un bug o no, ma esploriamo cosa succede e ci preoccupiamo più tardi.

Che cos'è <>? Si scopre che è solo una macro definita in Kernel.<>/2. Cosa possiamo fare con i macro per capirli meglio? Espandili!

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

Possiamo vedere che <> desugars alla normale sintassi di binario. Sfortunatamente per noi assume che gli argomenti siano binari! Abbiamo delle stringhe di bit - da qui l'errore. Come sistemarlo? Possiamo utilizzare direttamente la sintassi normale binario/bitstring:

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

Che funziona come previsto.

EDIT: Ho seguito su questo. Questo comportamento è previsto. L'operatore <> è progettato per funzionare su file binari e non su stringhe di bit. L'errore è piuttosto spiacevole, ma sta arrivando in profondità da Erlang.

+0

È fantastico grazie! Ho iniziato a percorrere quella strada, ma non avevo le capacità per arrivare dove mi hai preso. Grazie ancora! – djdrzzy