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

Yos*_*sef 11 ruby

我想避免迭代nil数组.

我的坏解决方案:

if nil!=myArr
    myArr.each { |item|
      p item;
    }
 end
Run Code Online (Sandbox Code Playgroud)

Mic*_*ski 23

对于简单的单行程,您也可以使用 unless myArr.nil?

myArr.each { |item| p item } unless myArr.nil?
Run Code Online (Sandbox Code Playgroud)

更新Ruby> = 2.3.0:

如果您对nil返回感到满意而不是完全避免执行,则可以使用" 安全"导航操作符&..请注意,这略有不同.虽然unless版本将完全跳过执行,但&.将执行但返回nil.

myArr&.each { |item| p item }
# returns nil
Run Code Online (Sandbox Code Playgroud)

  • 使用`nil?`几乎总是无关紧要的,除非你专门测试一个值为'false`的值,而不是从布尔角度测试false. (2认同)

xda*_*azz 12

在Ruby中,只有nilfalse被认为是假的.

if myArr
    myArr.each { |item|
      p item
    }
end
Run Code Online (Sandbox Code Playgroud)

  • 您也可以将其折叠为`myArr和myArr.each ...` (3认同)

Cer*_*eal 10

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

Array(myArr).each { |item| p item }
Run Code Online (Sandbox Code Playgroud)

根据文档,这样做:

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

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