Ruby案例陈述奇怪

时间:2014-08-22 17:26:16

标签: ruby mongoid pry case-statement

我看到Ruby中特有的一些我不理解的东西,想知道是否有人能告诉我我失踪的东西。这里有一些撬起的产品:

[77] pry(main)> c.fields['iparties'].type
=> Array
[78] pry(main)> c.fields['iparties'].type == Array
=> true
[79] pry(main)> case c.fields['iparties'].type
[79] pry(main)* when Array
[79] pry(main)*   puts "Array!"
[79] pry(main)* else
[79] pry(main)*   puts "Something else?"
[79] pry(main)* end
Something else?
=> nil

c是一个Mongoid对象,显然我要查看其中一个模型字段的类型。该字段是一个数组,如第77行所示,并在第78行的比较中确认。但是,当我通过"当"声明,它与阵列比较器不匹配。如果我将案例定义更改为

case c.fields['iparties'].type.to_s

我将数组匹配更改为

when 'Array'

它按预期工作,输出为"数组!"。

我不明白为什么它不会像现在这样展示,所以如果有人能向我解释,我真的很感激。

2 个答案:

答案 0 :(得分:1)

这是因为case使用===

Array == Array   #=> true
Array === Array  #=> false

作为

Array.class     #=> Class
Class.ancestors #=> [Class, Module, Object, Kernel, BasicObject]

所以适用Module#===

mod === obj→true或false。如果obj是mod的实例或mod的后代之一,则返回true。

答案 1 :(得分:1)

从你的.type中取出case即可。 when的神奇之处在于when Array表示if Array === val,如果参数是该类的实例,则类的===方法返回true!