Feature #5044
closed#zip with block return mapped results
Description
Is there any reason that #zip doesn't return results like map?
[1,2,3].zip([1,2,3]){ |a,b| a + b } #=> [2,4,6]
Currently, it just returns nil, which seems rather contrary to the return result of the non-block form.
Updated by Eregon (Benoit Daloze) over 13 years ago
Hi,
Please have a look at http://redmine.ruby-lang.org/issues/4539 (or [ruby-core:35613]).
The reason is explained by Yusuke in [ruby-core:35682]:
2011/4/5 Benoit Daloze eregontp@gmail.com:
An unconditional nil is anyway not useful here, the only concern I see
might be the cost of creating this Array.It is actually a problem.
I have used Array#zip with block for iteration many times.big_ary1.zip(big_ary2) do |x, y|
p [x, y]
endThe change requires some people (including me) to rewrite
such a code as follows:big_ary1.size.times do |i|
x, y = big_ary1[i], big_ary2[i]
...
endSo I like zip_with, if it is really needed.
That issue kind of got lost, it is probably a good idea to continue it.
For your example, we could have [1,2,3].zip_with([1,2,3], :+)
Updated by akr (Akira Tanaka) over 12 years ago
Currently it can be implemented as follows.
% ruby -e 'p [1,2,3].zip([1,2,3]).map {|a,b| a + b }'
[2, 4, 6]
% ruby -e 'p [1,2,3].lazy.zip([1,2,3]).map {|a,b| a + b }.to_a'
[2, 4, 6]
Updated by mame (Yusuke Endoh) over 12 years ago
- Status changed from Open to Assigned
- Assignee set to matz (Yukihiro Matsumoto)
Updated by mame (Yusuke Endoh) about 12 years ago
- Target version set to 2.6
Updated by matz (Yukihiro Matsumoto) almost 7 years ago
- Status changed from Assigned to Rejected
We cannot change the behavior. The change would increase the memory consumption (and decrease the performance).
Matz.
Updated by duerst (Martin Dürst) about 5 years ago
- Related to Feature #16261: Enumerable#each_splat and Enumerator#splat added