Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';这是';Ruby way';一次迭代两个数组的步骤_Ruby_Arrays_Iterator - Fatal编程技术网

什么';这是';Ruby way';一次迭代两个数组的步骤

什么';这是';Ruby way';一次迭代两个数组的步骤,ruby,arrays,iterator,Ruby,Arrays,Iterator,与其说是要解决的问题,不如说是对语法的好奇 我有两个长度相等的数组,希望同时对它们进行迭代—例如,在某个索引处输出它们的值 @budget = [ 100, 150, 25, 105 ] @actual = [ 120, 100, 50, 100 ] 我知道我可以使用每个_索引并索引到数组中,如下所示: @budget.each_index do |i| puts @budget[i] puts @actual[i] end 有没有更好的Ruby方法?像这样的 使用该方法并向其传递一

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

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

@budget = [ 100, 150, 25, 105 ]
@actual = [ 120, 100, 50, 100 ]
我知道我可以使用
每个_索引
并索引到数组中,如下所示:

@budget.each_index do |i|
  puts @budget[i]
  puts @actual[i]
end
有没有更好的Ruby方法?像这样的


使用该方法并向其传递一个块以按顺序迭代相应的元素。

除了
a.zip(b)。每个{x,y}
正如其他人所说,您也可以说
[a,b]。转置。每个{x,y}
,这让我觉得稍微对称一些。但是可能没有这么快,因为您正在创建额外的
[a,b]
数组。

有另一种方法可以使用枚举器同时迭代两个数组:

>> @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]]
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
2.1.2:003>enum=[1,2,4]。每个
=> # 
2.1.2:004>enum2=[5,6,7]。每个
=> # 
2.1.2:005>循环do
2.1.2:006>a1,a2=enum.next,enum2.next
2.1.2:007?>放入“数组1{a1}数组2{a2}”
2.1.2:008?>结束
数组1数组2 5
阵列1 2阵列2 6
阵列1 4阵列2 7

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

与原始问题相关,用于迭代长度不等的数组,您希望在其中循环使用值

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

[[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)

那一个
懒惰的
通过使生成的枚举数懒惰求值来节省您的时间。

折衷一下,使用带有索引的#each#u如何

include Enumerable 

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

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

这两个数组的大小是否相同?是的,已知两个数组的长度相同。每个数组都可以展开数组元素?我想知道Ruby还有多少我不知道的地方:/如果要使用这样的表达式,最好在方法调用中使用括号,以防万一@budget.zip(@actual)。each@AboutRuby:在这种情况下,它是必需的!修正了。当我看到像这样的红宝石线条时,我把手举在空中,像个冠军一样在房间里打转!这个比例是多少?如果我有2个10000项数组,这是否需要制作一个20000项数组?文档建议了这一点。+1
转置的一个好处是,如果两个数组的长度不相同,它会引发异常。有没有办法在上面显示的
循环中获取索引?
include Enumerable 

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

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