もやもやエンジニア

IT系のネタで思ったことや技術系のネタを備忘録的に綴っていきます。フロント率高め。

Elixir 入門 その4 - case, cond and if

case

  • パターンマッチを使った条件式を書くことができる。
  • 例えばHTTPのレスポンスのパターンマッチは以下のように書くことができる。
  • 1行目にマッチすると評価値のbodyの値(この場合はHello World !!)がcase内のbodyに束縛される。
  • 最後の _ は何もマッチしなければ出力されるので 、他の言語のcase文におけるdefaultのような書き方
case %{status_code: 200, body: "Hello World !!"} do
     %{status_code: 200, body: body} -> body
     %{status_code: 404} -> "not found"
     %{status_code: 500} -> "Internal server error"
     _ -> "Error"
end
  • case内のvariableに ^ をつけるとマッチしていても再束縛できないので例外が投げられる
  • guardを使ってマッチした後の絞り込みをする。パターンの後にwhenでガード式を書く。
  • ガード式内で使えるexpressionは限られているので注意。公式ページに一覧が載ってる。

  • 下記の例は本来1行目にマッチしているのだが、guardの条件で弾かれているのでnot matchとなる

case [1, 2, 3] do
     [1, x, 3] when x * 2 < 3 -> x
     _ -> "not match"
end
"not match"

cond

  • より自由度の高い条件式としてcondが使える。他の言語でのwhich case文みたいな
  • 純粋にtrueかfalseで判定されているのでnilかfalseでなければcaseに当てはまる。たとえば1つ目のしきで true -> "hogehoge"としとけば必ずそれ以降には進まない。
cond do
    2 + 2 == 5 -> "This will not be true"
    2 * 2 == 3 -> "Nor this"
    1 + 1 == 2 -> "But this will"
end
"But this will"

if / unless

  • これは他の言語と同じように扱える。unlessは否定のif文
if true do
    "trueなのでこっち"
else
    "こっちにはこない"
end
"trueなのでこっち"

unless true do
   "trueじゃなければ該当するのでここにはこない"
end
nil