https://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17113305112013-10-01T09:53:30ZRuby Issue Tracking SystemRuby master - Feature #8970: Array.zip and Array.producthttps://bugs.ruby-lang.org/issues/8970?journal_id=421252013-10-01T09:53:30Zakr (Akira Tanaka)akr@fsij.org
<ul></ul><p>2013/10/1 sawa (Tsuyoshi Sawada) <a href="mailto:sawadatsuyoshi@gmail.com" class="email">sawadatsuyoshi@gmail.com</a>:</p>
<blockquote>
<p>Feature <a class="issue tracker-2 status-1 priority-4 priority-default" title="Feature: Array.zip and Array.product (Open)" href="https://bugs.ruby-lang.org/issues/8970">#8970</a>: Array.zip and Array.product<br>
<a href="https://bugs.ruby-lang.org/issues/8970" class="external">https://bugs.ruby-lang.org/issues/8970</a></p>
</blockquote>
<blockquote>
<p>Most of the time when I use <code>Array#zip</code> or <code>Array#product</code>, I feel cumbursome that I have to take out the first array and pass it as a receiver. For example, if I have</p>
<pre><code>a = [[:a, :b, :c], [:d, :e, :f], [:g, :h, :i]]
</code></pre>
<p>I have to do something like this:</p>
<pre><code>a.first.zip(*a.drop(1)){...}
a.first.product(*a.drop(1)){...}
</code></pre>
<p>Sometimes, the receiver (i.e., the first array) has significance, but most other times, that breaks asymmetry, making the code look ugly.</p>
<p>I would be happy if we had <code>Array.zip</code> and <code>Array.product</code> in addition so that we can do it like this:</p>
<pre><code>Array.zip(*a){...}
Array.product(*a){...}
</code></pre>
</blockquote>
<p>How different with Array#transpose ?</p>
<h2>% ruby -e '<br>
a = [[:a, :b, :c], [:d, :e, :f], [:g, :h, :i]]<br>
p a.first.zip(*a.drop(1))<br>
p a.transpose<br>
'<br>
[[:a, :d, :g], [:b, :e, :h], [:c, :f, :i]]<br>
[[:a, :d, :g], [:b, :e, :h], [:c, :f, :i]]</h2>
<p>Tanaka Akira</p> Ruby master - Feature #8970: Array.zip and Array.producthttps://bugs.ruby-lang.org/issues/8970?journal_id=421322013-10-01T14:03:36Zsawa (Tsuyoshi Sawada)
<ul></ul><p>akr, The difference between <code>Array#transpose</code> and <code>Array.zip</code> is just the same as with <code>Array#transpose</code> and <code>Array#zip</code>. That is, when any non-first array is shorter than the first, it is complemented with <code>nil</code>.</p> Ruby master - Feature #8970: Array.zip and Array.producthttps://bugs.ruby-lang.org/issues/8970?journal_id=455412014-03-01T14:40:26Zsowieso (So Wieso)sowieso@dukun.de
<ul></ul><p>+1<br>
This would make code more readable by not breaking the symmetry.<br>
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)</p>
<blockquote>
<p><code>Array.zip([1,2,3],[4,5,6]){|left,right| left + right} => [5,7,9]</code></p>
</blockquote> Ruby master - Feature #8970: Array.zip and Array.producthttps://bugs.ruby-lang.org/issues/8970?journal_id=455462014-03-01T18:40:52Zmarcandre (Marc-Andre Lafortune)marcandre-ruby-core@marc-andre.ca
<ul></ul><p>This is a duplicate of <a href="https://bugs.ruby-lang.org/issues/6499" class="external">https://bugs.ruby-lang.org/issues/6499</a> and <a href="https://bugs.ruby-lang.org/issues/7444" class="external">https://bugs.ruby-lang.org/issues/7444</a>.</p> Ruby master - Feature #8970: Array.zip and Array.producthttps://bugs.ruby-lang.org/issues/8970?journal_id=455482014-03-01T18:41:17Zmarcandre (Marc-Andre Lafortune)marcandre-ruby-core@marc-andre.ca
<ul><li><strong>Has duplicate</strong> <i><a class="issue tracker-2 status-6 priority-4 priority-default closed" href="/issues/6499">Feature #6499</a>: Array::zip</i> added</li></ul> Ruby master - Feature #8970: Array.zip and Array.producthttps://bugs.ruby-lang.org/issues/8970?journal_id=455492014-03-01T18:41:26Zmarcandre (Marc-Andre Lafortune)marcandre-ruby-core@marc-andre.ca
<ul><li><strong>Is duplicate of</strong> <i><a class="issue tracker-2 status-1 priority-4 priority-default" href="/issues/7444">Feature #7444</a>: Array#product_set</i> added</li></ul> Ruby master - Feature #8970: Array.zip and Array.producthttps://bugs.ruby-lang.org/issues/8970?journal_id=812622019-08-29T07:44:11Zosyo (manga osyo)
<ul></ul><p>If you use <a href="https://bugs.ruby-lang.org/issues/15955" class="external">https://bugs.ruby-lang.org/issues/15955</a>, you can write as follows.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">UnboundMethod</span>
<span class="c1"># apply or other name</span>
<span class="k">def</span> <span class="nf">apply</span><span class="p">(</span><span class="n">receiver</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="n">bind</span><span class="p">(</span><span class="n">receiver</span><span class="p">).</span><span class="nf">call</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="n">arrays</span> <span class="o">=</span> <span class="p">[[</span><span class="s2">"a"</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">],</span> <span class="p">[</span><span class="s2">"c"</span><span class="p">],</span> <span class="p">[</span><span class="s2">"d"</span><span class="p">,</span> <span class="s2">"e"</span><span class="p">]]</span>
<span class="nb">p</span> <span class="no">Array</span><span class="p">.</span><span class="nf">instance_method</span><span class="p">(</span><span class="ss">:product</span><span class="p">).</span><span class="nf">apply</span><span class="p">(</span><span class="o">*</span><span class="n">arrays</span><span class="p">)</span>
<span class="c1"># => [["a", "c", "d"], ["a", "c", "e"], ["b", "c", "d"], ["b", "c", "e"]]</span>
<span class="nb">p</span> <span class="no">Array</span><span class="p">.</span><span class="nf">instance_method</span><span class="p">(</span><span class="ss">:zip</span><span class="p">).</span><span class="nf">apply</span><span class="p">(</span><span class="o">*</span><span class="n">arrays</span><span class="p">)</span>
<span class="c1"># => [["a", "c", "d"], ["b", nil, "e"]]</span>
</code></pre>
<p>Need a syntax to call <code>instance_method</code> like <code>.:</code> ?</p> Ruby master - Feature #8970: Array.zip and Array.producthttps://bugs.ruby-lang.org/issues/8970?journal_id=812842019-08-30T06:09:39Zsawa (Tsuyoshi Sawada)
<ul></ul><p>osyo (manga osyo) wrote:</p>
<blockquote>
<p>If you use <a href="https://bugs.ruby-lang.org/issues/15955" class="external">https://bugs.ruby-lang.org/issues/15955</a>, you can write as follows.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">UnboundMethod</span>
<span class="c1"># apply or other name</span>
<span class="k">def</span> <span class="nf">apply</span><span class="p">(</span><span class="n">receiver</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="n">bind</span><span class="p">(</span><span class="n">receiver</span><span class="p">).</span><span class="nf">call</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="n">arrays</span> <span class="o">=</span> <span class="p">[[</span><span class="s2">"a"</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">],</span> <span class="p">[</span><span class="s2">"c"</span><span class="p">],</span> <span class="p">[</span><span class="s2">"d"</span><span class="p">,</span> <span class="s2">"e"</span><span class="p">]]</span>
<span class="nb">p</span> <span class="no">Array</span><span class="p">.</span><span class="nf">instance_method</span><span class="p">(</span><span class="ss">:product</span><span class="p">).</span><span class="nf">apply</span><span class="p">(</span><span class="o">*</span><span class="n">arrays</span><span class="p">)</span>
<span class="c1"># => [["a", "c", "d"], ["a", "c", "e"], ["b", "c", "d"], ["b", "c", "e"]]</span>
<span class="nb">p</span> <span class="no">Array</span><span class="p">.</span><span class="nf">instance_method</span><span class="p">(</span><span class="ss">:zip</span><span class="p">).</span><span class="nf">apply</span><span class="p">(</span><span class="o">*</span><span class="n">arrays</span><span class="p">)</span>
<span class="c1"># => [["a", "c", "d"], ["b", nil, "e"]]</span>
</code></pre>
<p>Need a syntax to call <code>instance_method</code> like <code>.:</code> ?</p>
</blockquote>
<p>Thank you for the suggestion, but that looks a little too long. It can also be written as:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="ss">:product</span><span class="p">.</span><span class="nf">to_proc</span><span class="o">.</span><span class="p">(</span><span class="o">*</span><span class="n">arrays</span><span class="p">)</span>
<span class="c1"># => [["a", "c", "d"], ["a", "c", "e"], ["b", "c", "d"], ["b", "c", "e"]]</span>
<span class="ss">:zip</span><span class="p">.</span><span class="nf">to_proc</span><span class="o">.</span><span class="p">(</span><span class="o">*</span><span class="n">arrays</span><span class="p">)</span>
<span class="c1"># => [["a", "c", "d"], ["b", nil, "e"]]</span>
</code></pre>
<p>But the proposal here seems to be favored more at least by mame-san (<a class="issue tracker-2 status-1 priority-4 priority-default" title="Feature: `Symbol#call` (Open)" href="https://bugs.ruby-lang.org/issues/16102">#16102</a>).</p> Ruby master - Feature #8970: Array.zip and Array.producthttps://bugs.ruby-lang.org/issues/8970?journal_id=1012372023-01-16T08:00:15Zduerst (Martin Dürst)duerst@it.aoyama.ac.jp
<ul><li><strong>Related to</strong> <i><a class="issue tracker-2 status-1 priority-4 priority-default" href="/issues/19324">Feature #19324</a>: Enumerator.product => Enumerable#product</i> added</li></ul>