如何比较Ruby中的类?

时间:2011-04-06 12:20:34

标签: ruby

如何比较Ruby中的类,或者换句话说,如何将这些Java代码转换为Ruby?

Class<?> clazz = ...;
if (clazz == String.class) {
  ...
} else if (clazz == Integer.class) {
  ...
}

澄清:我想比较对象实例或检查对象是否是类的实例。

编辑:我想要比较对象实例或检查对象是否是类的实例,即is_a?和{{1}不要帮助我。

3 个答案:

答案 0 :(得分:18)

您的Java代码的 literal 翻译类似于

klass = ...

if klass == String
  ...
elsif klass == Integer
  ...
end

或者,更具惯用力

klass = ...

case
when klass == String
  ...
when klass == Integer
  ...
end

或者

klass = ...

DISPATCH_TABLE = {
  String => -> { ... },
  Integer => -> { ... }
}

DISPATCH_TABLE[klass].()

然而,Ruby是一种面向对象的语言,而在面向对象的语言中,这根本就没有意义。你只需要写

class String
  def do_something
    ...
  end
end

class Integer
  def do_something
    ...
  end
end

语言将为您执行调度。这称为多态,几乎所有面向对象的语言都支持这种语言,而且许多非面向对象的语言也是如此。

这种特殊的转变是Martin Fowler的书(第255页)中描述的基本重构之一,它被称为Replace Conditional With Polymorphism Refactoring

为您的问题提供合理解决方案的最大问题是您没有告诉我们的问题。您只告诉我们解决方案是什么。或者,更准确地说,您告诉我们您认为解决方案是在Java 中,并且您不知何故希望Ruby中的解决方案完全 100%完全相同,即使语言不能更加不同。

为了提供一个好的解决方案,我们需要先了解问题。换句话说:问题中最相关的部分是 s

答案 1 :(得分:3)

>> "foo".class == "bar".class
true

答案 2 :(得分:3)

在Ruby中,所有类对象都是Class类的实例。类的名称是引用实例的常量。如果您有对类对象的引用,则可以将其与该类的命名常量进行比较。所以你可以这样做:

if klass == String
  ...
elsif klass == Integer
  ...
end

表达式String.class == Integer.class是正确的,因为这两个类的类当然是Class