155

和有什么区别

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

出于某种原因,有时第一个有效而第二个无效,而其他时候,第二个有效而第一个无效。为什么?哪一种是“正确”的方法?

4

5 回答 5

259

您必须使用:

case item
when MyClass
...

我有同样的问题: How to catch Errno::ECONNRESET class in "case when"?

于 2010-10-11T17:11:36.810 回答
70

是的,Nakilon 是正确的,您必须知道 threequal === 运算符如何作用于when子句中给出的对象。在红宝石中

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

是真的

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

了解case是调用一个threequal方法(MyClass.===(item)例如),并且可以定义该方法来做任何你想做的事情,然后你可以使用case语句与precisionw

于 2010-10-11T17:37:29.767 回答
20

您可以使用:

case item.class.to_s
    when 'MyClass'

...当以下扭曲是不可能的:

case item
    when MyClass

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

于 2015-04-09T23:24:55.873 回答
5

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

obj.classClass描述 的类的类型对象obj。If obj.classis MyClass, thenobj是使用MyClass.new(粗略地说)创建的。MyClass是一个类型的对象,Class它描述使用创建的任何对象MyClass.new

MyClass.class是对象的MyClass(它是描述使用创建的任何对象的类型的对象的类)。换句话说,.ClassMyClass.newMyClass.class == Class

于 2010-10-11T17:22:56.363 回答
1

这取决于item变量的性质。如果它是一个对象的实例,例如

t = 5

然后

t.class == Fixnum

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

t = Array

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

t.class == Class

编辑:请参阅如何在“case when”中捕获 Errno::ECONNRESET 类?正如 Nakilon 所说,因为我的回答可能是错误的。

于 2010-10-11T17:11:26.490 回答