【问题标题】:Ruby case statement oddityRuby case 语句奇怪
【发布时间】:2014-08-22 17:26:15
【问题描述】:

我在 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 行的比较中确认。但是,当我通过“when”语句运行它时,它与数组比较器不匹配。如果我将案例定义更改为

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

我将数组匹配更改为

when 'Array'

它按预期工作,输出为“Array!”。

我不明白为什么它不能像这里显示的那样工作,所以如果有人可以向我解释一下,我将非常感激。

【问题讨论】:

    标签: ruby mongoid pry case-statement


    【解决方案1】:

    因为case使用===

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

    作为

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

    所以Module#=== 适用:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多