LoginSignup
0
0

Ruby の `and` と `&&` は違う

Posted at

&&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 には気をつけたほうがよさそう

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0