[Elixir]パターンマッチやcase文でのwhenにおけるguard clauses

Elixirの記述に慣れるため、exercism.ioで簡単な問題を解きながら時間の合間に遊んでいます。
そこで少しエラーを何回も出してしまったのでメモ。

以下の通り、Elixirではguard clausesの中におけるbooleanの式ではand or not を使う必要があるみたいですね。

Note that while boolean operators such as and, or, not are allowed in guards, the more general and short-circuiting operators &&, || and ! are not.

from: http://elixir-lang.org/getting-started/case-cond-and-if.html

他言語だとビット演算云々で私は || とか && を使うことに慣れていたのでつまづいてしまった…

あと、同じように以下の[ここ]と書いている箇所。判定を読みやすくするために独自の関数を作ってみたのですが、guard clausesの中ではそのような独自な関数はちゃんとマクロ組んで作らないといけないのですね。

case example do
  x when [ここ] -> 処理
end

あらかじめこのwhenの中で使える関数が用意されていますが、それを超えるものはマクロ組んでいく必要があるみたい。ただ、それは可読性を損なう恐れのあるものなので、個人的には case example do のexampleをうまいこと表現したいですねー。

もう1個。以下のようなcaseを使った関数、パターンマッチを組み合わせた関数でも記述することができます。

  • case文
  def leap_year?(year) do
    case year do
      rem when rem(year, 400) == 0 -> true
      rem when rem(year, 100) == 0 -> false
      rem when rem(year, 4) == 0 -> true
      _ -> false
    end
  end
  • パターンマッチ
  def leap_year?(year) when rem(year, 400) == 0, do: true
  def leap_year?(year) when rem(year, 100) == 0, do: false
  def leap_year?(year) when rem(year, 4) == 0, do: true
  def leap_year?(_), do: false

whenの中に記述できる処理式には限りがあるので、複雑な分類であれば case を使うほうがよさそうですが、簡単な when で区分できる場合、関数自体を分けたほうが責務が明確になってよさそう。

個人的には、パターンマッチで関数を分ける => case文で処理を分ける、という優先順位で処理を考えるときの思考が定着してきた感じ。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中