我希望有一个这样的代码:改变使用相等运算符的“案例”块(红宝石)
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