代码之家  ›  专栏  ›  技术社区  ›  nfm

一次迭代两个数组的“Ruby方式”是什么

  •  116
  • nfm  · 技术社区  · 14 年前

    @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
    
    7 回复  |  直到 14 年前
        1
  •  280
  •   Marc-André Lafortune    14 年前
    >> @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
  •  21
  •   jwadsack    10 年前

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

        3
  •  20
  •   Donato    10 年前

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

    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
    

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

        4
  •  16
  •   Paul A Jungwirth Mathew Sachin    12 年前

    a.zip(b).each{|x,y| } [a,b].transpose.each{|x,y| } ,这让我觉得有点对称。可能没有那么快,但是,因为你创造了额外的 [a,b] 数组。

        5
  •  14
  •   xavriley    10 年前

    与原始问题相关,用于迭代 希望值循环使用的长度

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

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

    这样你就不用担心了 nil 只需使用zip即可获得的值

        6
  •  6
  •   Justin    9 年前

    如果要处理数组,只需将两个数组压缩在一起就可以很好地工作。但如果你面对的是没完没了的枚举器,比如这样的:

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

    enum1.zip(enum2) zip

    enum1.lazy.zip(enum2)
    

    那个 lazy

        7
  •  2
  •   Robert Schaaf    7 年前

    折衷一下,用#每个#和#索引怎么样?

    include Enumerable 
    
    @budget = [ 100, 150, 25, 105 ]
    @actual = [ 120, 100, 50, 100 ]
    
    @budget.each_with_index { |val, i| puts val; puts @actual[i] }