我想避免迭代nil数组。
我的糟糕解决方案:
if nil!=myArr
myArr.each { |item|
p item;
}
end
答案 0 :(得分:21)
对于简单的单行,您也可以使用unless myArr.nil?
myArr.each { |item| p item } unless myArr.nil?
如果您对nil
返回感到满意,而不是完全避免执行,则可以使用Safe navigation operator &.
。请注意,这略有不同。 unless
版本将完全跳过执行,而&.
将执行但返回nil
。
myArr&.each { |item| p item }
# returns nil
答案 1 :(得分:12)
在ruby中,只有nil
和false
被视为错误。
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。