📑
Ruby のシフト演算子と条件演算子の優先順位
次のようなコードを見たときにどういう結果を期待します?
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 リファレンスマニュアル)
シフト演算子を使う場合は右辺の演算子の優先順位に注意して使いましょう。
Discussion