更改“case”块的使用的相等运算符(Ruby)

时间:2013-04-28 10:12:38

标签: ruby comparison switch-statement

我希望有一个代码:

x = Date

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

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

有什么方法可以改变上面块的使用过的运算符/函数,这样我就可以得到预期的结果了吗?

3 个答案:

答案 0 :(得分:5)

x = Date

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

答案 1 :(得分:2)

AFAIK,如果您必须在案例陈述中进行===以外的比较,则必须使用case更详细的语法:

x = Date

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

答案 2 :(得分: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