2016-01-10 40 views
5

Biraz bit dizisi oluşturmayı düşünüyorum ve nasıl yapacağımı merak ediyorum. Bir bit dizesinin sonuna bit bir bit nasıl birleştirilir?

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

yüzden çalıştı:

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

bu mümkün mü

Ben sözdizimi şöyle iki bayt birleştirerek benzer olmasını bekliyordum? Şimdiden teşekkürler. Bir hata olup olmadığından tam olarak emin değilim, ama neler olup bittiğini inceleyelim ve daha sonra bunun için endişelenelim.

cevap

12

<> nedir? Bu sadece Kernel.<>/2'da tanımlanan bir makro ortaya çıkıyor. Daha iyi anlamak için makrolarla ne yapabiliriz? Genişletin onları!

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

görebiliyoruz normal ikili sözdizimi <> desugars. Maalesef bizim için argümanların ikili olduğunu varsayar. Bitstrings var - dolayısıyla hata. Nasıl düzeltilir? Normal ikili/bitstring sözdizimini doğrudan kullanabiliriz:

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

Beklendiği gibi çalışır.

DÜZENLEME: Bunu takip ettim. Bu davranış bekleniyor. <> operatörü, ikili dizgiler üzerinde çalışmak için değil ikili dosyalar üzerinde çalışmak üzere tasarlanmıştır. Hata oldukça tatsız, ama Erlang'ın içinden geliyor.

+0

Bu harika teşekkür ederim! Bu yoldan aşağı inmeye başladım ama beni aldığın yere ulaşmak için gereken becerilere sahip olmadım. Tekrar teşekkürler! – djdrzzy

İlgili konular