Ruby 类类型和 case 语句

有什么区别

case item.class
when MyClass
# do something here
when Array
# do something different here
when String
# do a third thing
end

还有

case item.class
when MyClass.class
# do something here
when Array.class
# do something different here
when String.class
# do a third thing
end

出于某种原因,第一个有时候有用,第二个没用,还有时候,第二个有用,第一个没用。为什么?哪一种是“正确”的做法?

54921 次浏览

它取决于 item变量的性质。

t = 5

那么

t.class == Fixnum

但如果它本身是一个类,例如

t = Array

那么它将是一个 Class对象,所以

t.class == Class

编辑 : 由于我的答案可能是错误的,请参考 Nakilon 所说的 如何在“ case when”中捕获 Errno: : ECONNRESET 类?

你必须使用:

case item
when MyClass
...

我也有同样的问题: 如何在“ case when”中捕获 Errno: : ECONNRESET 类?

在 Ruby 中,类名是引用描述特定类的 Class类型对象的常量。这意味着在 Ruby 中说 MyClass等同于在 Java 中说 MyClass.class

obj.class是描述 obj类的 Class类型的对象。如果 obj.classMyClass,那么 obj是使用 MyClass.new创建的(粗略地说)。MyClassClass类型的对象,它描述使用 MyClass.new创建的任何对象。

MyClass.classMyClass对象的类(Class类型的对象的 同学们描述使用 MyClass.new创建的任何对象)。换句话说,MyClass.class == Class

是的,Nakilon 是正确的,您必须知道 Threequal= = = 操作符是如何在 when子句中给定的对象上工作的。在 Ruby

case item
when MyClass
...
when Array
...
when String
...

真的

if MyClass === item
...
elsif Array === item
...
elsif String === item
...

要知道 case 调用的是一个 three = 方法(例如 MyClass.===(item)) ,可以定义这个方法来执行任何您想要的操作,然后您可以使用 case 语句进行精确定义

你可使用:

case item.class.to_s
when 'MyClass'

... 当下面的转折是不可能的:

case item
when MyClass

原因是 case使用 ======运算符描述的关系是 不可交换 。例如,5Integer,但是 Integer5吗?这就是你应该如何看待 case/when