コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Rubyの and と && は使い方によって優先度の影響で振る舞いが変わるので気をつける

DoubleRenderError避けに使う書き方で render :hoge and return みたいになぜandを使うのかという話。

実例

たとえばこんな感じで test.rb を作る

def normal(val)
  p val and return
  p "end of normal"
end

def shortcut(val)
  p val && return
  p "end of shortcut"
end

normal("hello")
shortcut("hello hello")

期待値として

hello
hello hello

と出てきてほしいが

$ ruby test.rb 
"hello"
$

という感じで終わる

こうなる原理

andは&&に比べて 優先順位の低い演算子 と説明がある

左辺を評価し、結果が偽であった場合はその値(つまり nil か false) を返します。左辺の評価結果が真であった場合には 右辺を評価しその結果を返します。 and は同じ働きをする優先順位の低い演算子です。 - 演算子式 (Ruby 2.6.0) - and

そのためメソッド呼び出しの括弧を省略すると解釈が変わる

p val and return
# 以下と同義
p(val) and return
p val && return
# 以下と同義
p(val && return)

そのため、後者はval && return が実行されるので、右式のreturnが評価され、pが実行される前に終わる

参考サイト