文字リストは、~cシジルを使って作成します。
~c"hello"
Elixirの古いバージョンでは、文字リストは'hello'のようにシングルクォートで表されていました。
文字列ととてもよく似ていますが、この2つのデータ型はまったく異なります。文字リストは整数の配列です。それぞれの整数は、ある文字のUnicode値、つまりコードポイントを表します。
[65, 66, 67]
# => ~c"ABC"
文字の前に?を付けると、そのコードポイントを取得できます。
?A
# => 65
[?:, ?)]
# => ~c":)"
文字リストは配列なので、他の配列と同じように、再帰やパターンマッチングを使って扱えます。
[first_letter | _] = ~c"cat"
first_letter
# => 99
++を使うと、2つの配列を連結できます。
~c"hi" ++ ~c"!"
# => ~c"hi!"
最初の配列が長いほど連結は遅くなるので、長さがまちまちな配列に何度も追加するのは避けましょう。
caseは、与えられた値をたくさんのパターンと比較できる制御構造です。case式の中の節は、マッチが見つかるまで、上から下へ順に評価されます。
age = 15
case age do
0 -> ~c"infant"
age when age < 4 -> ~c"baby"
age when age < 13 -> ~c"child"
age when age < 18 -> ~c"teenager"
_ -> ~c"adult"
end
# => ~c"teenager"
ドイツのミュンヘンにある大企業で、システム管理者として働いています。仕事のひとつに、メールアカウントの管理があります。
ミュラーにメールを送ることができないという不満の声を、よく耳にするようになりました。調べてみると、社内のほとんどが古いメールクライアントを使っていて、そのクライアントは非ASCII文字が含まれているという理由でmüller@firma.deを有効なメールアドレスとして認識しないことがすぐにわかります。
お気に入りの古いメールクライアントを手放すように言っても、勝ち目のない戦いです。そこで、すべてのメールアカウントにサニタイズした別名を作ることにします。
sanitize/1関数を実装しましょう。ユーザー名を文字リストとして受け取り、小文字以外の文字をすべて取り除いたユーザー名を返すようにします。
Username.sanitize(~c"schmidt1985")
# => ~c"schmidt"
sanitize/1関数を拡張しましょう。ユーザー名からアンダースコアを取り除かないようにします。
Username.sanitize(~c"mark_fischer$$$")
# => ~c"mark_fischer"
ドイツ語のアルファベットには非ASCII文字が4つあり、いずれにも広く知られたASCIIの代替表記があります。
| ドイツ語の文字 | ASCIIの代替表記 |
|---|---|
| ä | ae |
| ö | oe |
| ü | ue |
| ß | ss |
sanitize/1関数を拡張しましょう。表にしたがってドイツ語の文字を置き換えるようにします。ユーザー名はすべてすでに小文字であると想定してかまいません。
Username.sanitize(~c"cäcilie_weiß")
# => ~c"caecilie_weiss"