2013-04-28 63 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