如何避免迭代Ruby中的nil数组?

时间:2012-03-26 14:16:20

标签: ruby

我想避免迭代nil数组。

我的糟糕解决方案:

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

6 个答案:

答案 0 :(得分:21)

对于简单的单行,您也可以使用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

答案 1 :(得分:12)

在ruby中,只有nilfalse被视为错误。

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

答案 2 :(得分:10)

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

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

根据documentation,这是:

  

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

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

答案 3 :(得分:2)

或者,使用andand

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

答案 4 :(得分:2)

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

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

Array.wrap会将nil转换为[],将Object转换为[Object],并将现有数组单独保留。如果一个传入而不是一个数组,也不会默默地对你的哈希进行屠杀。 (调用Array(myArr)会将myArr转换为数组,这会破坏哈希值,而不是将它们包装在数组中。

答案 5 :(得分:1)

myArr ||= []

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