我希望避免对一个空数组进行迭代。
我的不好的解决方案:
if nil!=myArr
myArr.each { |item|
p item;
}
end
我希望避免对一个空数组进行迭代。
我的不好的解决方案:
if nil!=myArr
myArr.each { |item|
p item;
}
end
如果只需要一个简单的一行代码,你也可以使用unless myArr.nil?
myArr.each { |item| p item } unless myArr.nil?
如果你可以接受返回 nil
而不是完全避免执行,你可以使用安全导航运算符 &.
。请注意,两者略有不同。虽然 unless
版本将完全跳过执行,但 &.
将执行并返回 nil
。
myArr&.each { |item| p item }
# returns nil
在 Ruby 中,只有 nil
和 false
被认为是 false。
if myArr
myArr.each { |item|
p item
}
end
myArr.each ...
,其中 myArr 是数组变量名。 - tadman你可以使用Array()
将数组值封装起来。
Array(myArr).each { |item| p item }
根据文档,这样做:
基本上,这将把通过使用由核心库提供的Array()方法,也可以创建一个数组。该方法尝试在其参数上调用to_ary和to_a方法。
nil
值转换为[]
。这既不会迭代,也不会抛出错误。但请注意,它对任何值都会执行相同的操作。Array("string")
将创建["string"]
。仅仅检查是否为空并不总是足够的。有时候,你期望是数组的变量在只有一个元素时被初始化为非数组对象。这不是常见的情况,但我见过一些专有服务可能会给你返回nil
、"Name1"
或["Name1", "Name2", ...]
的结果。为了可靠地处理这种输入范围,我更喜欢像这样访问我的数组:
Array.wrap(myArr).each { |item|
p item
}
Array.wrap
方法可以将nil
转换为[]
,将Object
转换为[Object]
,并保留现有的数组。此方法还可避免在传入哈希表而非数组时不会悄悄地破坏哈希表。调用Array(myArr)
会将myArr
转换为数组,这会破坏哈希表而不是将其包装在数组中。
myArr ||= []
然后进行迭代。 只有在myArr为空时,才会将空数组分配给它。
nil?
几乎总是多余的,除非您特别测试一个可能是值false
的值,而不仅仅是从布尔透视角度看到的 false。 - tadman