Elixir Schoolの勉強メモです。
文字列
Elixirにおいて文字列とはバイトのシーケンス。
iex(19)> string = <<104,101,108,108,111>>
"hello"
iex(20)> string <> <<0>>
<<104, 101, 108, 108, 111, 0>>
文字列に0
というバイトを追加すると、有効な文字列ではなくなるため、IExは文字列をバイナリとして表示する。
これは、文字列を表現するバイトがなんなのか確認したいときに有用。
<<>>
記法はコンパイラにこれらのシンボルで囲まれた中身はバイト列であることを示す。
文字リスト
内部ではElixirの文字列は文字の配列というよりはバイトのシーケンスで表現されており、Elixirは複数の文字のリストである文字リストという型を別に持っている。
Elixirの文字列はダブルクォートで生成され、一方文字リストはシングルクオートで生成される。
シングルクオートで生成される文字リストから得られるここの値はバイナリで表現されているコードポイントで、UTF-8でエンコードされている。
iex(23)> 'hełło'
[104, 101, 322, 322, 111]
iex(24)> "hełło" <> <<0>>
<<104, 101, 197, 130, 197, 130, 111, 0>>
322
はł のコードポイントで、UTF-8でエンコードされているので、197
、130
という2つのバイトになっている。
?
を使って、文字のコードポイントを取得することができる。
この記法は、文字のリストから情報を抽出するパターンを使うときに役に立つことが多い。
iex(26)> ?Z
90
書紀素とコードポイント
コードポイントはたた単純にUnicodeの文字で、UTF-8のエンコーディングに応じて1バイト以上のバイトで表現されるものとして差し支えない。
ASCIIの範囲外の文字は常に2バイト以上にエンコードされる。たとえばá, ñ, è
のようなチルダやアクセントのついたラテン文字は2バイトにエンコードされる。
アジア言語の文字はしばしば3から4バイトにエンコードされる。
書記素は1文字にレンダリングされる複数のコードポイントから成る。
文字列関数
length/1
書記素の長さを返す。
iex(31)> String.length "Hello"
5
replace/3
iex(33)> String.replace("Hello", "e", "a")
"Hallo"
duplicate/2
iex(34)> String.duplicate("Oh my ", 3)
"Oh my Oh my Oh my "
split/2
iex(36)> String.split("Hello World", " ")
["Hello", "World"]