Elixir学習記
← 前 | 目次 | 次 → |
---|---|---|
3. 演算子 | 4. パターンマッチング | - |
パターンマッチング
Elixirでは マッチ演算子=
を使って、左辺と右辺のパターンマッチングができる
1 = 1
1
1 = 2
** (MatchError) no match of right hand side value: 2
x = 1
1
1 = x
1
2 = x
** (MatchError) no match of right hand side value: 1
x = 2
2
1 = y
** (CompileError) xxx : undefined function y/0 (there is no such import)
- 左辺に変数が含まれている場合、右辺にマッチするようにバインドされる
- 左辺と右辺が等しくないときは、MatchErrorになる
- 定義されていない変数を右辺に置くと、関数とみなされCompileErrorになる
パターンマッチングなので、以下のような処理も可能
# まとめてバインド
{ a, b, c } = { 1, 2, 3 }
# a = 1, b = 2, c = 3
# 特定の値をバインド
{:ok, result } = {:ok, "Success"}
# result = "Success"
# 意図しない形式はエラーにする
{:ok, result} = {:error, :oops}
** (MatchError) no match of right hand side value: {:error, :oops}
左辺で指定するパターンに変数を使いたいけど、バインドはしたくないという場合
ピン演算子^
を使う
status = :ok
{^status, result} = {:ok, "Success"}
# result = "Success"
変数のバインド以外は、何に使えるの?
こちらの記事がめちゃくちゃ分かりやすいです
パターンマッチは Elixir のあれやこれ ・・・ 変数束縛、データ型の分解、繰り返し処理、関数の選択的実行、条件分岐などの基礎をなす重要な機能のひとつである。
参考資料
感想
- パターンマッチングを正しく理解することはElixir学習で欠かせない
- リストの分解と再帰
- Enum.map以外でコレクションを扱う強力な方法を知れた
- むやみにif文を使わない
- パターンマッチングを活用すればもっと簡潔に書けないか?を考えてみる