Ruby类的types和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 

出于某种原因,这些作品中的第一个有时候,第二个不是,其他时候,第二个作品,第一个没有。 为什么? 哪一个是“正确”的方法呢?

您必须使用:

 case item when MyClass 

我有同样的问题: 如何在“情况下”赶上Errno :: ECONNRESET类?

是的,Nakilon是正确的,你必须知道threequal ===操作符是如何处理when子句中给出的对象的。 在Ruby中

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

是真的

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

了解该案例正在调用threequal方法(例如MyClass.===(item) ),并且该方法可以被定义为做任何你想做的事情,然后你可以使用case语句和精确度

您可以使用:

 case item.class.to_s when 'MyClass' 

…当下面的扭曲是不可能的:

 case item when MyClass 

原因是这种case使用======运算符描述的关系是不可交换的 。 例如, 5是一个Integer ,但Integer5 ? 这是你应该怎么想的case / when

在Ruby中,类名称是一个常量,它引用了描述特定类的Classtypes的对象。 这意味着说Ruby中的MyClass相当于在Java中说MyClass.class

obj.class是一个描述obj类的Class类的obj 。 如果obj.classMyClass ,那么obj是使用MyClass.new创build的(粗略地说)。 MyClass是一个Classtypes的对象,描述了使用MyClass.new创build的任何对象。

MyClass.classMyClass对象的 (它是Classtypes的对象的Class ,描述使用MyClass.new创build的任何对象)。 换句话说, MyClass.class == Class

这取决于你的itemvariables的性质。 如果它是一个对象的实例,例如

 t = 5 

然后

 t.class == Fixnum 

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

 t = Array 

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

 t.class == Class 

编辑 :请参考如何捕捉Errno :: ECONNRESET类在“情况下”? 正如Nakilon所说,因为我的回答可能是错误的。

Interesting Posts