如何比较Ruby中的类,或者换句话说,如何将这些Java代码转换为Ruby?
Class<?> clazz = ...;
if (clazz == String.class) {
...
} else if (clazz == Integer.class) {
...
}
澄清:我不想比较对象实例或检查对象是否是类的实例。
编辑:我不想要比较对象实例或检查对象是否是类的实例,即is_a?
和{{1}不要帮助我。
答案 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
。