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 ,但Integer是5 ? 这是你应该怎么想的case / when 。 
 在Ruby中,类名称是一个常量,它引用了描述特定类的Classtypes的对象。 这意味着说Ruby中的MyClass相当于在Java中说MyClass.class 。 
  obj.class是一个描述obj类的Class类的obj 。 如果obj.class是MyClass ,那么obj是使用MyClass.new创build的(粗略地说)。  MyClass是一个Classtypes的对象,描述了使用MyClass.new创build的任何对象。 
  MyClass.class是MyClass对象的类 (它是Classtypes的对象的Class ,描述使用MyClass.new创build的任何对象)。 换句话说, MyClass.class == Class 。 
 这取决于你的itemvariables的性质。 如果它是一个对象的实例,例如 
 t = 5 
然后
 t.class == Fixnum 
但如果它本身就是一个类,例如
 t = Array 
 那么它将是一个Class对象,所以 
 t.class == Class 
编辑 :请参考如何捕捉Errno :: ECONNRESET类在“情况下”? 正如Nakilon所说,因为我的回答可能是错误的。