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 では関数呼び出しの引数を囲むカッコは必須ではない。