【发布时间】:2012-04-10 01:21:35
【问题描述】:
我想避免遍历 nil 数组。
我的错误解决方案:
if nil!=myArr
myArr.each { |item|
p item;
}
end
【问题讨论】:
标签: ruby
我想避免遍历 nil 数组。
我的错误解决方案:
if nil!=myArr
myArr.each { |item|
p item;
}
end
【问题讨论】:
标签: ruby
对于一个简单的单行,你也可以使用unless myArr.nil?
myArr.each { |item| p item } unless myArr.nil?
如果您对nil 返回而不是完全避免执行感到满意,您可以使用Safe navigation operator &.。请注意,这略有不同。 unless 版本将完全跳过执行,&. 将执行但返回 nil。
myArr&.each { |item| p item }
# returns nil
【讨论】:
nil? 几乎总是无关紧要的,除非您专门测试一个可能是值false 的值,而不仅仅是从布尔角度来看的假。
在 ruby 中,只有 nil 和 false 被视为 false。
if myArr
myArr.each { |item|
p item
}
end
【讨论】:
myArr and myArr.each ...
您可以将数组值包装在Array()中。
Array(myArr).each { |item| p item }
根据documentation,这样做:
也可以使用 Kernel 提供的 Array() 方法创建数组,该方法尝试调用 to_ary,然后在其参数上调用 to_a。
基本上,这会将nil 值转换为[]。这既不会迭代,也不会引发错误。公平的警告,它会对任何价值做同样的事情。 Array("string") 将创建 ["string"]。
【讨论】:
或者,使用andand
myArr.andand.each { | item| p item }
【讨论】:
仅检查 nil 并不总是足够的。有时,您希望是数组的变量可以在只有一个时初始化为非数组对象。这并不常见,但我见过的专有服务可能会给您nil、"Name1" 或["Name1", "Name2", ...] 的结果。为了可靠地处理这个范围的输入,我更喜欢这样访问我的数组:
Array.wrap(myArr).each { |item|
p item
}
Array.wrap 会将nil 转换为[],Object 转换为[Object],并保留现有数组。如果传入一个而不是数组,也可以方便地不默默地处理你的哈希。 (调用Array(myArr) 会将myArr 转换为一个数组,这会破坏哈希而不是将它们包装在数组中。
【讨论】:
myArr ||= []
然后迭代。 只有当它为 nil 时,这才会将空数组分配给 myArr。
【讨论】:
false,它也会赋值。