Dav*_*man 127 ruby duck-typing case-statement
有什么区别
case item.class
when MyClass
# do something here
when Array
# do something different here
when String
# do a third thing
end
Run Code Online (Sandbox Code Playgroud)
和
case item.class
when MyClass.class
# do something here
when Array.class
# do something different here
when String.class
# do a third thing
end
Run Code Online (Sandbox Code Playgroud)
出于某种原因,这些中的第一个有时会起作用而第二个起作用,而其他时候,第二个起作用,而第一个起作用.为什么?哪一个是"正确"的方式呢?
Nak*_*lon 218
你必须使用:
case item
when MyClass
...
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题: 如何在"case when"中捕获Errno :: ECONNRESET类?
Fre*_*red 55
是的,Nakilon是正确的,您必须知道threequal ===运算符如何处理when子句中给出的对象.在Ruby中
case item
when MyClass
...
when Array
...
when String
...
Run Code Online (Sandbox Code Playgroud)
是真的
if MyClass === item
...
elsif Array === item
...
elsif String === item
...
Run Code Online (Sandbox Code Playgroud)
理解这种情况是调用一个三等方法(MyClass.===(item)例如),并且可以定义该方法做任何你想做的事情,然后你可以使用带有precisionw的case语句
use*_*833 11
您可以使用:
case item.class.to_s
when 'MyClass'
Run Code Online (Sandbox Code Playgroud)
......当无法进行以下扭曲时:
case item
when MyClass
Run Code Online (Sandbox Code Playgroud)
这样做的原因是case使用===和操作员描述的关系不是可交换的===.例如,5是一个Integer,但是Integer一个5?这就是你应该怎么想case/ when.
在Ruby中,类名是一个常量,它引用Class描述特定类的类型的对象。这意味着MyClass在Ruby 中说等同于MyClass.class在Java中说。
obj.class是Class描述类别的类型的对象obj。如果obj.class为MyClass,则obj使用MyClass.new(大致而言)创建。MyClass是类型的对象,Class它描述使用创建的任何对象MyClass.new。
MyClass.class是类的MyClass对象(它的类类型的对象的Class描述使用创建的任何对象MyClass.new)。换句话说,MyClass.class == Class。
| 归档时间: |
|
| 查看次数: |
38673 次 |
| 最近记录: |