Ruby Issue Tracking System: Issueshttps://redmine.ruby-lang.org/https://redmine.ruby-lang.org/favicon.ico?17113305112018-08-25T17:29:49ZRuby Issue Tracking System
Redmine Ruby master - Bug #15027 (Rejected): When Struct#each method is overriden Struct#select and Struc...https://redmine.ruby-lang.org/issues/150272018-08-25T17:29:49Zbruno (Bruno Sutic)
<a name="Bug"></a>
<h3 >Bug<a href="#Bug" class="wiki-anchor">¶</a></h3>
<p>Here's the code snippet that should reproduce the problem:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">class</span> <span class="nc">Foo</span> <span class="o"><</span> <span class="no">Struct</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="ss">:bar</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">each</span><span class="p">(</span><span class="o">&</span><span class="n">block</span><span class="p">)</span>
<span class="p">[</span><span class="ss">:baz</span><span class="p">,</span> <span class="ss">:qux</span><span class="p">].</span><span class="nf">each</span><span class="p">(</span><span class="o">&</span><span class="n">block</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="n">foo</span> <span class="o">=</span> <span class="no">Foo</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="ss">:foo</span><span class="p">)</span>
<span class="n">foo</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="o">&</span><span class="ss">:itself</span><span class="p">)</span> <span class="c1"># => [:baz, :qux] # OK</span>
<span class="n">foo</span><span class="p">.</span><span class="nf">to_a</span> <span class="c1"># => [:foo] # NOT OK, expected [:baz, :qux]</span>
<span class="n">foo</span><span class="p">.</span><span class="nf">select</span><span class="p">(</span><span class="o">&</span><span class="ss">:itself</span><span class="p">)</span> <span class="c1"># => [:foo] # NOT OK, expected [:baz, :qux]</span>
</code></pre>
<p>As you can see, even tho we defined another collection for use by overriding <code>#each</code>, the <code>to_a</code> and <code>select</code> still use <code>Struct</code>'s original collection.</p>
<p>The problem seem to be with <code>Struct#to_a</code> and <code>Struct#select</code> methods from <code>struct.c</code> file that are defined unnecessarily.</p>
<a name="Proposed-solution"></a>
<h3 >Proposed solution<a href="#Proposed-solution" class="wiki-anchor">¶</a></h3>
<p>The attached solution simply deletes <code>Struct#select</code> and <code>Struct#to_a</code>. A couple tests are added to show everything still works as before.</p>
<p>Please let me know if I can provide any more info and I'll be ready to do so.</p>