【问题标题】:How can I avoid iterating over a nil array in Ruby?如何避免在 Ruby 中遍历 nil 数组?
【发布时间】:2012-04-10 01:21:35
【问题描述】:

我想避免遍历 nil 数组。

我的错误解决方案:

if nil!=myArr
    myArr.each { |item|
      p item;
    }
 end

【问题讨论】:

    标签: ruby


    【解决方案1】:

    对于一个简单的单行,你也可以使用unless myArr.nil?

    myArr.each { |item| p item } unless myArr.nil?
    

    为 Ruby >= 2.3.0 更新:

    如果您对nil 返回而不是完全避免执行感到满意,您可以使用Safe navigation operator &.。请注意,这略有不同。 unless 版本将完全跳过执行,&. 将执行但返回 nil

    myArr&.each { |item| p item }
    # returns nil
    

    【讨论】:

    • 使用nil? 几乎总是无关紧要的,除非您专门测试一个可能是值false 的值,而不仅仅是从布尔角度来看的假。
    • 在 ruby​​ 2.3 中使用 & 运算符非常棒 (myArr&.each { |item| p item })
    • 感谢 & 运算符的介绍。太棒了!
    【解决方案2】:

    在 ruby​​ 中,只有 nilfalse 被视为 false。

    if myArr
        myArr.each { |item|
          p item
        }
    end
    

    【讨论】:

    • 你也可以把这个折叠成myArr and myArr.each ...
    【解决方案3】:

    您可以将数组值包装在Array()中。

    Array(myArr).each { |item| p item }
    

    根据documentation,这样做:

    也可以使用 Kernel 提供的 Array() 方法创建数组,该方法尝试调用 to_ary,然后在其参数上调用 to_a。

    基本上,这会将nil 值转换为[]。这既不会迭代,也不会引发错误。公平的警告,它会对任何价值做同样的事情。 Array("string") 将创建 ["string"]

    【讨论】:

    • @muistooshort GetSet 的答案仅适用于 Rails。这个答案也适用于普通的 Ruby。
    【解决方案4】:

    或者,使用andand

    myArr.andand.each { | item| p item }
    

    【讨论】:

      【解决方案5】:

      仅检查 nil 并不总是足够的。有时,您希望是数组的变量可以在只有一个时初始化为非数组对象。这并不常见,但我见过的专有服务可能会给您nil"Name1"["Name1", "Name2", ...] 的结果。为了可靠地处理这个范围的输入,我更喜欢这样访问我的数组:

      Array.wrap(myArr).each { |item|
        p item
      }
      

      Array.wrap 会将nil 转换为[]Object 转换为[Object],并保留现有数组。如果传入一个而不是数组,也可以方便地不默默地处理你的哈希。 (调用Array(myArr) 会将myArr 转换为一个数组,这会破坏哈希而不是将它们包装在数组中。

      【讨论】:

      • 普通的 ruby​​ 数组也会将 nil 转换为 [],将 Object 转换为 [Object],并且不理会现有数组。你对哈希是正确的。
      【解决方案6】:
      myArr ||= []
      

      然后迭代。 只有当它为 nil 时,这才会将空数组分配给 myArr。

      【讨论】:

      • 不,不会。如果是false,它也会赋值。
      猜你喜欢
      • 2018-08-02
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多