我看到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'
它按预期工作,输出为"数组!"。
我不明白为什么它不会像现在这样展示,所以如果有人能向我解释,我真的很感激。
答案 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!