トラック
/
Elixir
Elixir
/
演習
/
ドイツのシステム管理者
ドイツのシステム管理者

ドイツのシステム管理者

学習演習

はじめに

文字リスト

文字リストは、~cシジルを使って作成します。

~c"hello"
Note

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は、与えられた値をたくさんのパターンと比較できる制御構造です。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を有効なメールアドレスとして認識しないことがすぐにわかります。

お気に入りの古いメールクライアントを手放すように言っても、勝ち目のない戦いです。そこで、すべてのメールアカウントにサニタイズした別名を作ることにします。

1. 小文字以外の文字をすべて取り除いて既存のユーザー名をサニタイズする

sanitize/1関数を実装しましょう。ユーザー名を文字リストとして受け取り、小文字以外の文字をすべて取り除いたユーザー名を返すようにします。

Username.sanitize(~c"schmidt1985")
# => ~c"schmidt"

2. アンダースコアを許可する

sanitize/1関数を拡張しましょう。ユーザー名からアンダースコアを取り除かないようにします。

Username.sanitize(~c"mark_fischer$$$")
# => ~c"mark_fischer"

3. ドイツ語の文字を置き換える

ドイツ語のアルファベットには非ASCII文字が4つあり、いずれにも広く知られたASCIIの代替表記があります。

ドイツ語の文字 ASCIIの代替表記
ä ae
ö oe
ü ue
ß ss

sanitize/1関数を拡張しましょう。表にしたがってドイツ語の文字を置き換えるようにします。ユーザー名はすべてすでに小文字であると想定してかまいません。

Username.sanitize(~c"cäcilie_weiß")
# => ~c"caecilie_weiss"
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Elixir Exercism

ドイツのシステム管理者を始める準備はできましたか?

Exercismに登録すれば、58個のコンセプト168個の演習、そして本物の人間によるメンタリングとともに、Elixirを学んでマスターできます。すべて無料です。