&&
と and
とか、!
と not
とか、一緒じゃんって思ってるとバグることがあるので注意
何が違うか
演算子同士の優先度が違う。要は演算子を並べたときのくっつく順序が違う。
高い :: [] +(単項) ! ~ ** -(単項) * / % + - << >> & | ^ > >= < <= <=> == === != =~ !~ && || .. ... ?:(条件演算子) =(+=, -= ... ) not 低い and or
左の「高い」「低い」は演算子の優先順位です。
代入(=
)より優先度が低い演算子
代入 =
より優先度が低いもの(not
, and
, or
)とかは割と罠にハマると思う。たとえばある値が範囲内にあるかをチェックし、その結果を変数に代入する処理を考えてみる。
# value が min ~ max の範囲内にあるか調べる
max = 100
min = 1
value = 1000
# この式は `false` が返る
in_range = min <= value and value <= max
# => false
and
を &&
だと思っていると正しそうに見えるが、変数 in_range
には true
が代入されている!!
puts in_range
# => true
これは =
の優先順位より and
の優先順位が低いため起こる。
in_range = min <= value and value <= max
# これは以下と等価
# in_range の代入後に and 以降が評価される
(in_range = min <= value) and (value <= max)
&&
は =
より優先順位が高いので、上記のようなことにはならない。
in_range = min <= value && value <= max
# => false
puts in_range
# => false
# これと等価
in_range = (min <= value && value <= max)
まとめ
演算子の優先順位に注意! とくに =
より優先順位の低い and
or
not
には気をつけたほうがよさそう