スポンサーリンク

2015年8月15日

[Elixir]文字列と文字リストの違いを習得する

とある錬金術師の万能薬(Elixir)

Goal

文字列と文字リストの違いについて学ぶ。
また、Elixirのバイナリについて習得する。

Dev-Environment

OS: Windows8.1
Erlang: Eshell V6.4, OTP-Version 17.5
Elixir: v1.0.4

Wait a minute

文字列(Strings)と文字リスト(Char lists)の違いについても学んでみます。
また、Elixirでのバイナリの扱い方を習得したいと思います。
UTF-8とは何か?・・・リンク先を参照して下さい。
参考: ギークを目指して - 文字コードの考え方から理解するUnicodeとUTF-8の違い

Index

Binaries, strings and char lists
|> Strings and Char Lists
|> Strings
|> Char Lists
|> Binaries
|> Extra

Strings and Char Lists

文字列と文字リストの違いについて。
簡単なまとめ・・・
  • Elixirのデフォルトエンコードは、(BOMなし)UTF-8
  • 文字列と文字リストはどちらもバイナリ
  • 文字列はUTF-8でエンコードされたバイナリ
  • 文字リストは文字(コードポイント)のリスト
  • “”(二重引用符)で囲めば文字列として扱われる
  • ‘’(単一引用符)で囲めば文字リストとして扱われる
  • コードポイントの値を得るには?(疑問符)を使う
Description:
文字には割り当てられているコードポイントと言うものがある。
例えば、aなら97といった感じに・・・
(コードポイントは1byte以上の時もある)
iex> ?a
97
文字列も文字リストのどちらもバイナリ。
iex> string = "hello"
"hello"
iex> is_binary(string)
true
iex> char_list = "hello"
"hello"
iex> is_binary(char_list)
true

Strings

文字列について。
簡単なまとめ・・・
(重複部分があります)
  • 文字列はUTF-8でエンコードされたバイナリ
  • “”(二重引用符)で囲めば文字列として扱われる
byteサイズと文字列の長さを取得してみる。
iex> string = "hello"
"hello"
iex> byte_size(string)
5
iex> String.length(string)
5
コードポイント毎に分割してみる。
iex> String.codepoints(string)
["h", "e", "l", "l", "o"]
詳しく知りたければドキュメントを参照して下さい。
ドキュメント: hexdocs - v1.0.5 Elixir String

Char Lists

文字リストについて。
簡単なまとめ・・・
(重複部分があります)
  • 文字リストは文字(コードポイント)のリスト
  • ‘’(単一引用符)で囲めば文字リストとして扱われる
iex> char_list = 'hello'
'hello'
iex> is_list(char_list)
true

Binaries

バイナリについて。
簡単なまとめ・・・
  • <<>>で囲めばバイナリとして扱われる
  • バイナリはバイトの連なり
  • ヌルバイト<<0>>を結合させると文字列のバイナリが見れる
  • 値はバイナリではなくビット列として扱われる
  • バイナリは8で割り切れる数のビット列の集まり(8bitずつ)
  • 文字列として妥当ではない場合がある
バイナリを使ってみる。
iex> bin = <<0, 1, 2, 3>>
<<0, 1, 2, 3>>
iex> byte_size(bin)
4
iex> <<0, 1>> <> <<2, 3>>
<<0, 1, 2, 3>>
iex> "hello" <> <<0>>
<<104, 101, 108, 108, 111, 0>>
iex> <<97 :: utf8>>
"a"
バイナリでパターンマッチをさせてみる。
iex> <<0, 1, x>> = <<0, 1, 2>>
<<0, 1, 2>>
iex> x
2
iex> <<0, 1, x>> = <<0, 1, 2, 3>>
** (MatchError) no match of right hand side value: <<0, 1, 2, 3>>

iex> <<0, 1, x :: binary>> = <<0, 1, 2, 3>>
<<0, 1, 2, 3>>
iex> x
<<2, 3>>
少し変わったパターンマッチ。
(文字列もバイナリだから可能なやり方)
iex> "he" <> llo = "hello"
"hello"
iex> llo
"llo"
ビット列を使ってみる。
iex> bit = <<1 :: size(1)>>
<<1::size(1)>>
iex> is_binary(bit)
false
iex> is_bitstring(bit)
true
iex> bit_size(bit)
1

Extra

文字列や文字リストを変換してみます。
文字列->文字リスト&文字リスト->文字列
iex> string = "hello"
"hello"
iex> char_list = to_char_list(string)
'hello'
iex> to_string(char_list)
"hello"
iex> string == to_string(char_list)
true

Speaking to oneself

バイナリ、文字列、文字リストはやや理解し辛い部分がありますね。
分かってしまえば大したことではないのですが。
これで、バイナリ、文字列、文字リストについては分かりました。
必要がなければ文字列使っておけば問題ないですよ。
きっと、おそらく、多分、メイビー(笑)

Bibliography

人気の投稿