2013-04-28 61 views
2

我希望有一个这样的代码:改变使用相等运算符的“案例”块(红宝石)

x = Date 

case x 
when Date 
    puts "Date" 
when String 
    puts "String" 
else 
    puts "Unknown" 
end 

我知道x == Date是真实的,但x === Date是假的。所以当我期待“日期”时我会得到“未知”。

任何方式来改变上面的块使用的操作符/函数,以便我可以得到预期的结果?

+0

这里有什么相关的事实是'Date === x'是'false'。 “x === Date”是“false”的事实是无关紧要的。令人误解的是,'==='是不可交换的。 – sawa 2013-04-28 10:46:48

+0

您通常使用'case'作为实例,但这里'x'是一个类。当然这是合法的,但这并不常见。 – tokland 2013-04-28 10:51:13

回答

5
x = Date 

case x.name 
when "Date" 
    puts "Date" 
when "String" 
    puts "String" 
else 
    puts "Unknown" 
end 
+0

从最近10分钟,我试图记住这一点,但失败了。现在看到你的后,回到我的生活。 :) – 2013-04-28 10:35:28

2

据我所知,如果你必须有一个case语句比===其他比较,你必须使用的case了更详细的语法:

x = Date 

case 
when x == Date 
    puts "Date" 
when x == String 
    puts "String" 
else 
    puts "Unknown" 
end 
2

另一种方式来做到这一点:

class ComparableClass 
    attr_accessor :klass 

    def initialize(klass) 
    @klass = klass 
    end 
end 

class Class 
    alias_method :'old_triple_equals', :'===' 

    def ===(other) 
    if other.is_a? ComparableClass 
     self == other.klass 
    else 
     old_triple_equals(other) 
    end 
    end 
end 

klass = Date 

case ComparableClass.new(klass) 
when Date 
    puts 'Its a date' 
when String 
    puts 'Its a string' 
else 
    puts 'Its something else' 
end 

#=> Its a date 
+0

+1为“去那里”,实际上改变'==='的行为。大锤对这个'case'声明我坚信,但你永远不知道什么时候它可能变成有用的控制。 – 2013-04-28 16:53:20