同时迭代两个数组的“ Ruby 方法”是什么

与其说是要解决问题,不如说是对语法的好奇。

我有两个长度相等的数组,希望同时对它们进行迭代——例如,在某个索引处输出它们的值。

@budget = [ 100, 150, 25, 105 ]
@actual = [ 120, 100, 50, 100 ]

我知道我可以像这样使用 each_index和索引到数组中:

@budget.each_index do |i|
puts @budget[i]
puts @actual[i]
end

有没有更好的 鲁比的方式? 有没有 喜欢这样的?

# Obviously doesn't achieve what I want it to - but is there something like this?
[@budget, @actual].each do |budget, actual|
puts budget
puts actual
end
61409 次浏览

使用 Array.zip方法并将一个块传递给它,以便按顺序迭代相应的元素。

>> @budget = [ 100, 150, 25, 105 ]
=> [100, 150, 25, 105]
>> @actual = [ 120, 100, 50, 100 ]
=> [120, 100, 50, 100]


>> @budget.zip @actual
=> [[100, 120], [150, 100], [25, 50], [105, 100]]


>> @budget.zip(@actual).each do |budget, actual|
?>   puts budget
>>   puts actual
>> end
100
120
150
100
25
50
105
100
=> [[100, 120], [150, 100], [25, 50], [105, 100]]

除了 a.zip(b).each{|x,y| }之外,正如其他人所说,你也可以说 [a,b].transpose.each{|x,y| },这让我觉得有点对称。不过,可能没有这么快,因为您正在创建额外的 [a,b]数组。

还有一种使用枚举器一次迭代两个数组的方法:

2.1.2 :003 > enum = [1,2,4].each
=> #<Enumerator: [1, 2, 4]:each>
2.1.2 :004 > enum2 = [5,6,7].each
=> #<Enumerator: [5, 6, 7]:each>
2.1.2 :005 > loop do
2.1.2 :006 >     a1,a2=enum.next,enum2.next
2.1.2 :007?>   puts "array 1 #{a1} array 2 #{a2}"
2.1.2 :008?>   end
array 1 1 array 2 5
array 1 2 array 2 6
array 1 4 array 2 7

枚举器比上面使用的示例更强大,因为它们允许无限级数、并行迭代和其他技术。

与最初的问题相关,用于迭代 不平等长度的数组,您希望在这些数组中循环使用这些值

[1,2,3,4,5,6].zip([7,8,9].cycle)

露比会给你

[[1, 7], [2, 8], [3, 9], [4, 7], [5, 8], [6, 9]]

这样可以避免使用 zip 获得 nil

如果您正在处理数组,那么只需将两个数组压缩在一起就可以很好地工作。但是,如果你正在处理永无止境的枚举数,比如下面这些东西:

enum1 = (1..5).cycle
enum2 = (10..12).cycle

enum1.zip(enum2)失败是因为 zip尝试计算所有元素并组合它们:

enum1.lazy.zip(enum2)

这个 lazy通过使结果枚举器延迟计算来节省您的时间。

如何妥协,并使用 # each _ with _ index?

include Enumerable


@budget = [ 100, 150, 25, 105 ]
@actual = [ 120, 100, 50, 100 ]


@budget.each_with_index { |val, i| puts val; puts @actual[i] }