Feature #8970

Array.zip and Array.product

Added by Tsuyoshi Sawada 7 months ago. Updated about 1 month ago.

[ruby-core:57498]
Status:Open
Priority:Normal
Assignee:-
Category:-
Target version:-

Description

=begin
Most of the time when I use Array#zip or Array#product, I feel cumbursome that I have to take out the first array and pass it as a receiver. For example, if I have

a = [[:a, :b, :c], [:d, :e, :f], [:g, :h, :i]]

I have to do something like this:

a.first.zip(*a.drop(1)){...}
a.first.product(*a.drop(1)){...}

Sometimes, the receiver (i.e., the first array) has significance, but most other times, that breaks asymmetry, making the code look ugly.

I would be happy if we had Array.zip and Array.product in addition so that we can do it like this:

Array.zip(*a){...}
Array.product(*a){...}

=end


Related issues

Duplicated by ruby-trunk - Feature #6499: Array::zip Rejected 05/26/2012
Duplicates ruby-trunk - Feature #7444: Array#product_set Open 11/27/2012

History

#1 Updated by Akira Tanaka 7 months ago

2013/10/1 sawa (Tsuyoshi Sawada) sawadatsuyoshi@gmail.com:

Feature #8970: Array.zip and Array.product
https://bugs.ruby-lang.org/issues/8970

Most of the time when I use Array#zip or Array#product, I feel cumbursome that I have to take out the first array and pass it as a receiver. For example, if I have

a = [[:a, :b, :c], [:d, :e, :f], [:g, :h, :i]]

I have to do something like this:

a.first.zip(*a.drop(1)){...}
a.first.product(*a.drop(1)){...}

Sometimes, the receiver (i.e., the first array) has significance, but most other times, that breaks asymmetry, making the code look ugly.

I would be happy if we had Array.zip and Array.product in addition so that we can do it like this:

Array.zip(*a){...}
Array.product(*a){...}

How different with Array#transpose ?

% ruby -e '
a = [[:a, :b, :c], [:d, :e, :f], [:g, :h, :i]]
p a.first.zip(*a.drop(1))
p a.transpose
'
[[:a, :d, :g], [:b, :e, :h], [:c, :f, :i]]
[[:a, :d, :g], [:b, :e, :h], [:c, :f, :i]]
--
Tanaka Akira

#2 Updated by Tsuyoshi Sawada 7 months ago

akr, The difference between Array#transpose and Array.zip is just the same as with Array#transpose and Array#zip. That is, when any non-first array is shorter than the first, it is complemented with nil.

#3 Updated by So Wieso about 1 month ago

+1
This would make code more readable by not breaking the symmetry.
Also would be nice if the block version wouldn't return nil, but instead the concatenation of all return values, like map does. (not that an explicit map would hurt, but this is a waste of a return value)

Array.zip([1,2,3],[4,5,6]){|left,right| left + right} => [5,7,9]

#5 Updated by Marc-Andre Lafortune about 1 month ago

#6 Updated by Marc-Andre Lafortune about 1 month ago

Also available in: Atom PDF