Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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