我希望有一個這樣的代碼:改變使用相等運算符的「案例」塊(紅寶石)
x = Date
case x
when Date
puts "Date"
when String
puts "String"
else
puts "Unknown"
end
我知道x == Date
是真實的,但x === Date
是假的。所以當我期待「日期」時我會得到「未知」。
任何方式來改變上面的塊使用的操作符/函數,以便我可以得到預期的結果?
我希望有一個這樣的代碼:改變使用相等運算符的「案例」塊(紅寶石)
x = Date
case x
when Date
puts "Date"
when String
puts "String"
else
puts "Unknown"
end
我知道x == Date
是真實的,但x === Date
是假的。所以當我期待「日期」時我會得到「未知」。
任何方式來改變上面的塊使用的操作符/函數,以便我可以得到預期的結果?
x = Date
case x.name
when "Date"
puts "Date"
when "String"
puts "String"
else
puts "Unknown"
end
從最近10分鐘,我試圖記住這一點,但失敗了。現在看到你的後,回到我的生活。 :) – 2013-04-28 10:35:28
據我所知,如果你必須有一個case語句比===
其他比較,你必須使用的case
了更詳細的語法:
x = Date
case
when x == Date
puts "Date"
when x == String
puts "String"
else
puts "Unknown"
end
另一種方式來做到這一點:
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
+1爲「去那裏」,實際上改變'==='的行爲。大錘對這個'case'聲明我堅信,但你永遠不知道什麼時候它可能變成有用的控制。 – 2013-04-28 16:53:20
這裏有什麼相關的事實是'Date === x'是'false'。 「x === Date」是「false」的事實是無關緊要的。令人誤解的是,'==='是不可交換的。 – sawa 2013-04-28 10:46:48
您通常使用'case'作爲實例,但這裏'x'是一個類。當然這是合法的,但這並不常見。 – tokland 2013-04-28 10:51:13