今回の記事ではRubyにおける演算子(operator)に着目し、演算子の種類、優先順位という概念、そして演算子を定義する方法について解説します。
Rubyにおける演算子と優先順位
Rubyはモダンな言語に期待される大抵の演算子を備えています。たとえば算術における加減乗除(+, -, *, /
)や法(%
)・べき乗(**
)、比較演算子(>, <, <=, >=, <=>
)、論理演算子(&&, ||, !, and, or, not
)、バイナリ演算子(&, |, ^, ~
)などです。
以下に一覧を示します。演算子には優先順位が存在し(後述)、上にあるほど優先順位が高くなっています。
出典: 『パーフェクトRuby』p.73
優先順位の実例
演算子の優先順位とは、代数学の四則演算で「×と÷は、+と-よりも先に計算する」というルールによって 1 + 2 * 3
が 1 + (2 * 3)
と解釈されていたように、並べて書いた時どちらの演算を先に行うか、あらかじめ定義しておくものです。
カッコを付け計算順を明示することで、優先順位とは別の順番で計算させることができるのもすんなり納得できる話だと思います。
一点、and
とor
について補足しておきます。これらの演算子は、以下のようにそれぞれ&&
、||
と同じく論理AND、論理ORに相当します。
and
とor
は可読性が高くてよさそうに見えるのですが、先に上げた表からわかる通り優先順位が低く、代入式やメソッド呼び出しと同じ行に書いたときの挙動が直感的に掴みづらいため個人的に利用をおすすめしません。例えば以下の様な例が考えられます。
&&
とand
で結果が異なっています。これは、and
よりも代入演算子(=
)の優先度が高いため、and
の評価よりも先にboolにTが代入されてしまうためです。
他人のつもりで読んでみて瞬時に処理順序がわからないコードは、()
を使って優先順位を明示してやるか、複数式に分割するほうが良いと思います。
次のページでは、メソッドとして定義されている演算子と、それらの再定義について解説します。