如何在Ruby中避免对空数组进行迭代?

13

我希望避免对一个空数组进行迭代。

我的不好的解决方案:

if nil!=myArr
    myArr.each { |item|
      p item;
    }
 end
6个回答

29

如果只需要一个简单的一行代码,你也可以使用unless myArr.nil?

myArr.each { |item| p item } unless myArr.nil?

更新 Ruby >= 2.3.0 版本的方法:

如果你可以接受返回 nil 而不是完全避免执行,你可以使用安全导航运算符 &.。请注意,两者略有不同。虽然 unless 版本将完全跳过执行,但 &. 将执行并返回 nil

myArr&.each { |item| p item }
# returns nil

2
使用 nil? 几乎总是多余的,除非您特别测试一个可能是值 false 的值,而不仅仅是从布尔透视角度看到的 false。 - tadman
在 Ruby 2.3 中使用 & 运算符非常棒(myArr&.each { |item| p item })。 - Simonini
感谢介绍 & 运算符。它太棒了! - Aboozar Rajabi

15

在 Ruby 中,只有 nilfalse 被认为是 false。

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

3
你可以将它简写为 myArr.each ...,其中 myArr 是数组变量名。 - tadman

13

你可以使用Array()将数组值封装起来。

Array(myArr).each { |item| p item }
根据文档,这样做:

通过使用由核心库提供的Array()方法,也可以创建一个数组。该方法尝试在其参数上调用to_ary和to_a方法。

基本上,这将把nil值转换为[]。这既不会迭代,也不会抛出错误。但请注意,它对任何值都会执行相同的操作。Array("string")将创建["string"]

1
@muistooshort的回答仅适用于Rails。而这个答案同样适用于纯Ruby。 - Wayne Conrad

3

仅仅检查是否为空并不总是足够的。有时候,你期望是数组的变量在只有一个元素时被初始化为非数组对象。这不是常见的情况,但我见过一些专有服务可能会给你返回nil"Name1"["Name1", "Name2", ...]的结果。为了可靠地处理这种输入范围,我更喜欢像这样访问我的数组:

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

Array.wrap方法可以将nil转换为[],将Object转换为[Object],并保留现有的数组。此方法还可避免在传入哈希表而非数组时不会悄悄地破坏哈希表。调用Array(myArr)会将myArr转换为数组,这会破坏哈希表而不是将其包装在数组中。


普通的 Ruby 数组也会将 nil 转换为 [],将 Object 转换为 [Object],并保留现有的数组。你对哈希表的看法是正确的。 - shushugah

2

Alternatively, using andand

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

1
myArr ||= []

然后进行迭代。 只有在myArr为空时,才会将空数组分配给它。


2
不,它不会。如果是“false”,它也会赋值。 - Jörg W Mittag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接