【一人 Ruby Advent Calendar 2017】Ruby の && と || 演算子【14日目】

一人 Ruby Advent Calendar 2017 14日目の記事になります。
今回は Ruby&&|| 演算子のお話。

&&|| 演算子

Ruby&&|| 演算子はちょっと特殊で、真理値ではなくて『左辺、もしくは右辺を評価した値』を返します。

  • &&:左辺を評価して、
    • 偽であればその値(nilfalse)を返す
    • 真であれば右辺を評価し結果を返す
  • ||:左辺を評価して、
    • 真であればその値を返す
    • 偽であれば右辺を評価し結果を返す
p 1 && 2         # => 2
p nil && false   # => nil
p false && nil   # => false

p 1 || 2         # => 1
p nil || false   # => false
p false || nil   # => nil

ですので、以下のような書き方を行うこともできます。

# value が偽でなければ右辺を評価した値を返す
value && value + 10

# キーが存在していれば右辺を評価した値を返す
hash[key] && hash[key].hoge

また、|| を利用して『変数が未定義(もしくは偽)の場合に初期化する』というコードも記述することができます。

a ||= 1   # a が偽か未定義ならば値を代入する

このような初期化はよく見かけるので覚えておくとよいでしょう。

ちなみに前回、Ruby の演算子はメソッドと書きましたが &&|| は特別な演算子なので『メソッドではないこと』に注意してください。

# 以下のような呼び出しはできない
1.&& 2
1.send(:&&) 2

class X
    # 再定義もできない
    def &&
        
    end
end

まとめ

  • &&|| は真理値ではなくて評価した値を返す
  • &&|| は特別な演算子で再定義できない


&&|| は特別な演算子ではありますが、慣れると便利なので Ruby を使うならその挙動を理解しておくとよいでしょう。