バイナリ,文字列,文字リスト

 cf. 6 バイナリ,文字列そして文字リスト – Binaries, strings and char lists – Elixir

バイナリ

バイナリは Elixir のデータの一つでビット列……もっと正確に言うとバイト列だ。バイナリは << >> で表すことができる。

iex(1)> x = <<0, 1, 2, 3>>
<<0, 1, 2, 3>>
iex(2)> is_binary x
true

バイナリが何バイトあるかは byte_size/1 で求められる。

iex(3)> byte_size x
4

バイナリの連結は <> 演算子。文字列の連結演算子と同じだけど、その理由は後から出てくる。

iex(4)> <<1, 2>> <> <<3, 4>>
<<1, 2, 3, 4>>

文字列

Elixir において、文字列は特殊なバイナリだ。

iex(5)> is_binary "hello"
true

特殊、とはどういうことかというと、そのバイナリが UTF-8 で解釈できるか(エンコードできるか)ということだ。だから次のような例では、バイナリを作っても文字列が返ってくる。

iex(6)> <<104, 101, 108, 108, 111>>
"hello"

逆に文字列のバイナリ表現を見るには、ヌルバイト <<0>> を連結してみるのが一般的らしい。

iex(7)> "hello" <> <<0>>
<<104, 101, 108, 108, 111, 0>>

パターンマッチング

バイナリもパターンマッチングできる。バイナリのパターンはちょうど1バイト(8ビット)ずつを期待していることに注意。

iex(8)> <<1, x, 3>> = <<1, 2, 3>>
<<1, 2, 3>>
iex(9)> x
2
iex(10)> <<1, 2, x :: binary>> = <<1, 2, 3, 4>>
<<1, 2, 3, 4>>
iex(11)> x
<<3, 4>>

2番目の例では、x に「残り」のバイナリが束縛される。

文字リスト

"(二重引用符)は文字列を作る。これに対して '(単一引用符)は文字リストを作る。

iex(12)> 'hello'
'hello'
iex(13)> is_list 'hello'
true

文字列と文字リストは別のもの。

iex(14)> 'hello' == "hello"
false

文字リストから文字列に変換するには to_string/1 が使える。

iex(15)> to_string 'hello'
"hello"

補足

このエントリでは、関数呼び出しをカッコなしで書いた: is_binary x のように。Elixir では関数呼び出しの引数を囲むカッコは必須ではない。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください