📑

Ruby のシフト演算子と条件演算子の優先順位

2024/06/05に公開

次のようなコードを見たときにどういう結果を期待します?

flag = false
result = []
result << flag ? "OK" : "NG"
result << flag ? "OK" : "NG"
result << flag ? "OK" : "NG"
pp result
# => ???

パッと見 ["NG", "NG", "NG"] を返すのかな?と思ったんですが実態は [false, false, false] という値を返します。
これはシフト演算子が条件演算子よりも優先順位が高いからになります。

# こういうコードは
result << flag ? "OK" : "NG"

# こうではなくて
result << (flag ? "OK" : "NG")

# こういう評価になる
(result << flag) ? "OK" : "NG"

改めて Ruby の演算子の優先順位を見てみるとシフト演算子って思ったよりも高いんですねー。

高い   ::
       []
       +(単項)  !  ~
       **
       -(単項)
       *  /  %
       +  -
       << >>
       &
       |  ^
       > >=  < <=
       <=> ==  === !=  =~  !~
       &&
       ||
       ..  ...
       ?:(条件演算子)
       =(+=, -= ... )
       not
低い   and or

参照: 演算子式 (Ruby 3.3 リファレンスマニュアル)

シフト演算子を使う場合は右辺の演算子の優先順位に注意して使いましょう。

GitHubで編集を提案

Discussion