From: Gavin Kistner Date: 2006-09-14T01:26:43+09:00 Subject: Re: How to collect over two arrays then look back to one? From: Peter Booth [mailto:pbooth@marketaxess.com] > Two parallel arrays A, B . For each element n of A for which > f(An) is true, > is g(B[n-3:n+3]) true? Where B[n-3:n+3] refers to seven > elements of B whose > position is centered over An' position. > > Can the block inside Enumerable#collect know it's position inside the > Enumerable? Can one collect two parallel arrays? #collect_with_index doesn't exist natively (but should) #zip will merge the arrays, and then you can map the results. module Enumerable def map_with_index a = [] each_with_index { |x, i| a << yield( x, i ) } a end end class Array def sum inject(0){ |s,v| s+v } end end def f( n ) n % 2 == 0 end def g( *vals ) vals.sum end a = (1..10).to_a b = (10..20).to_a pairs = a.zip( b ) odd_sums = pairs.map_with_index{ |pair, i| a_val = pair[ 0 ] if f( a_val ) b_vals = pairs[ (i-3)..(i+3) ].map{ |pair| pair[1] } g( *b_vals ) else nil end } p odd_sums #=> [nil, 0, nil, 91, nil, 105, nil, 99, nil, 70]