https://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17113305112019-06-27T23:35:12ZRuby Issue Tracking SystemRuby master - Bug #11808: Different behavior between Enumerable#grep and Array#grephttps://bugs.ruby-lang.org/issues/11808?journal_id=789362019-06-27T23:35:12Zjeremyevans0 (Jeremy Evans)merch-redmine@jeremyevans.net
<ul></ul><p><code>Array#grep</code> is actually <code>Enumerable#grep</code>:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">Array</span><span class="p">.</span><span class="nf">instance_method</span><span class="p">(</span><span class="ss">:grep</span><span class="p">).</span><span class="nf">owner</span>
<span class="o">=></span> <span class="no">Enumerable</span>
</code></pre>
<p>If I had to guess, the cause of the difference is that <code>Array#each</code> is implemented in C, and <code>Test#each</code> is implemented in Ruby, and this affects Regexp special variable scope. You see similar behavior as Array in other classes that implement <code>#each</code> in C, such as Range or File.</p>
<p>The documentation for the special global variables states: <code>These global variables are thread-local and method-local variables.</code> This indicates to me that the bug is that the variables are accessible inside the <code>Array#each</code> block, since that block executes inside the current method, it's not local to the <code>Array#each</code> method. However, I would assume removing the current behavior would break too much existing code.</p> Ruby master - Bug #11808: Different behavior between Enumerable#grep and Array#grephttps://bugs.ruby-lang.org/issues/11808?journal_id=789632019-06-30T00:13:36Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<ul><li><strong>Tracker</strong> changed from <i>Bug</i> to <i>Feature</i></li><li><strong>Description</strong> updated (<a title="View differences" href="/journals/78963/diff?detail_id=52358">diff</a>)</li><li><strong>ruby -v</strong> deleted (<del><i>2.2.2</i></del>)</li><li><strong>Backport</strong> deleted (<del><i>2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN</i></del>)</li></ul><p>There is no API for it now.</p>
<p><a href="https://github.com/nobu/ruby/tree/feature/11808-block_svar" class="external">https://github.com/nobu/ruby/tree/feature/11808-block_svar</a></p> Ruby master - Bug #11808: Different behavior between Enumerable#grep and Array#grephttps://bugs.ruby-lang.org/issues/11808?journal_id=789652019-06-30T00:15:13Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<ul><li><strong>Subject</strong> changed from <i>DIfferent behavior between Enumerable#grep and Array#grep</i> to <i>Different behavior between Enumerable#grep and Array#grep</i></li></ul> Ruby master - Bug #11808: Different behavior between Enumerable#grep and Array#grephttps://bugs.ruby-lang.org/issues/11808?journal_id=792782019-07-11T06:04:26Zmatz (Yukihiro Matsumoto)matz@ruby.or.jp
<ul><li><strong>Tracker</strong> changed from <i>Feature</i> to <i>Bug</i></li><li><strong>Backport</strong> set to <i>2.5: UNKNOWN, 2.6: UNKNOWN</i></li></ul><p>It is a bug. It has been hidden for 10+ years and seems to be very difficult to fix.<br>
It should be fixed in the long run.</p>
<p>Matz.</p> Ruby master - Bug #11808: Different behavior between Enumerable#grep and Array#grephttps://bugs.ruby-lang.org/issues/11808?journal_id=792792019-07-11T06:04:49Zko1 (Koichi Sasada)
<ul><li><strong>Assignee</strong> set to <i>ko1 (Koichi Sasada)</i></li></ul> Ruby master - Bug #11808: Different behavior between Enumerable#grep and Array#grephttps://bugs.ruby-lang.org/issues/11808?journal_id=881762020-10-26T04:36:51Zko1 (Koichi Sasada)
<ul></ul><p>Sorry we need more time to consider.</p> Ruby master - Bug #11808: Different behavior between Enumerable#grep and Array#grephttps://bugs.ruby-lang.org/issues/11808?journal_id=1052982023-11-13T19:27:08Znoelrap (Noel Rappin)noelrap@hey.com
<ul></ul><p>This appears to be fixed in 3.3.0dev as of Nov 2023,</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">001</span><span class="o">*</span> <span class="k">class</span> <span class="nc">Test</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">002</span><span class="o">*</span> <span class="kp">include</span> <span class="no">Enumerable</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">003</span><span class="o">*</span> <span class="k">def</span> <span class="nf">each</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">004</span><span class="o">*</span> <span class="k">return</span> <span class="n">enum_for</span><span class="p">(</span><span class="ss">:each</span><span class="p">)</span> <span class="k">unless</span> <span class="nb">block_given?</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">005</span><span class="o">*</span> <span class="k">yield</span> <span class="s2">"Hello"</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">006</span><span class="o">*</span> <span class="k">yield</span> <span class="s2">"World"</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">007</span><span class="o">*</span> <span class="k">end</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">00</span><span class="mi">8</span><span class="o">></span> <span class="k">end</span>
<span class="o">=></span> <span class="ss">:each</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">00</span><span class="mi">9</span><span class="o">></span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">010</span><span class="o">></span> <span class="n">enum</span> <span class="o">=</span> <span class="no">Test</span><span class="p">.</span><span class="nf">new</span>
<span class="o">=></span> <span class="c1">#<Test:0x0000000102ba5038></span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">011</span><span class="o">></span> <span class="n">array</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"Hello"</span><span class="p">,</span> <span class="s2">"World"</span><span class="p">]</span>
<span class="o">=></span> <span class="p">[</span><span class="s2">"Hello"</span><span class="p">,</span> <span class="s2">"World"</span><span class="p">]</span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">012</span><span class="o">></span>
<span class="n">irb</span><span class="p">(</span><span class="n">main</span><span class="p">):</span><span class="mo">013</span><span class="o">></span> <span class="n">enum</span><span class="p">.</span><span class="nf">grep</span><span class="p">(</span><span class="sr">/^(.)/</span><span class="p">)</span> <span class="p">{</span><span class="vg">$1</span><span class="p">}</span>
<span class="o">=></span> <span class="p">[</span><span class="s2">"H"</span><span class="p">,</span> <span class="s2">"W"</span><span class="p">]</span>
</code></pre>
<p>However, it was still broken in 3.2.2. It's not clear to me when the behavior changed.</p>