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