Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

caseで継承を使わず自前クラスを評価してみる

「==」と「===」はクラスにより挙動が異なる場合があります。
例えば、Stringクラスならば

> "str" === String
=> false

> "str" == String
=> false

> String === "str"
=> true

> String == "str"
=> false

という動きになります。

case文の場合、判定に「===」を使います。
上で示したように、「===」では順番が重要になります。
caseではwhenの後ろに左の式、caseに右の式をおきます。

case "str"
when String     then puts 1
when Enumerator then puts 2
else                 puts 0
end

> 1
=> nil

case String
when "str" then puts 1
when 2     then puts 2
else            puts 0
end

> 0
=> nil


というわけで、継承を使わずに自前メソッドをcaseで比較したい場合は以下のようにします
……下の例だと何の意味もありませんが(

class UltimateQuestion
  def self.=== a
    a == 42 ? true : false
  end
end
=> nil

> UltimateQuestion === 42
=> true

> 42 === UltimateQuestion
=> false

case 42
when UltimateQuestion then puts 1
when Numeric          then puts 2
else                puts 0
end

> 1
=> nil