Ruby Issue Tracking System: Issues
https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2019-07-25T12:16:47Z
Ruby Issue Tracking System
Redmine
Ruby master - Bug #16020 (Rejected): Forbid `if` `elsif` without a condition
https://bugs.ruby-lang.org/issues/16020
2019-07-25T12:16:47Z
bogdanvlviv (Bogdan Denkovych)
<p>Hello.</p>
<p>I might have missed something, but examples like:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">if</span>
<span class="nb">puts</span> <span class="s2">"!!!!1"</span>
<span class="k">elsif</span>
<span class="nb">puts</span> <span class="s2">"!!!!2"</span>
<span class="k">elsif</span>
<span class="nb">puts</span> <span class="s2">"!!!!3"</span>
<span class="k">else</span>
<span class="nb">puts</span> <span class="s2">"!!!!4"</span>
<span class="k">end</span>
<span class="c1"># Output:</span>
<span class="c1"># !!!!1</span>
<span class="c1"># !!!!2</span>
<span class="c1"># !!!!3</span>
<span class="c1"># !!!!4</span>
</code></pre>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">if</span> <span class="kp">false</span>
<span class="nb">puts</span> <span class="s2">"!!!!1"</span>
<span class="k">elsif</span> <span class="mi">1</span><span class="o">==</span><span class="mi">2</span>
<span class="nb">puts</span> <span class="s2">"!!!!2"</span>
<span class="k">elsif</span>
<span class="nb">puts</span> <span class="s2">"!!!!3"</span>
<span class="k">else</span>
<span class="nb">puts</span> <span class="s2">"!!!!4"</span>
<span class="k">end</span>
<span class="c1"># Output:</span>
<span class="c1"># !!!!3</span>
<span class="c1"># !!!!4</span>
</code></pre>
<p>are confusing. We probably should raise <code>SyntaxError</code> in the case when <code>if</code>/<code>elsif</code> is being used without any condition. What do you think about it?</p>
<p>Original source: <a href="https://twitter.com/bogdanvlviv/status/1154356514628493313" class="external">https://twitter.com/bogdanvlviv/status/1154356514628493313</a></p>
<p>Edited:</p>
<p><a href="https://twitter.com/mamantoha/status/1154369189647454213" class="external">https://twitter.com/mamantoha/status/1154369189647454213</a> helped me to figure out that</p>
<p>The code like</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">if</span> <span class="kp">false</span>
<span class="nb">puts</span> <span class="s2">"!!!!1"</span>
<span class="k">elsif</span> <span class="mi">1</span><span class="o">==</span><span class="mi">2</span>
<span class="nb">puts</span> <span class="s2">"!!!!2"</span>
<span class="k">elsif</span>
<span class="nb">puts</span> <span class="s2">"!!!!3"</span>
<span class="k">else</span>
<span class="nb">puts</span> <span class="s2">"!!!!4"</span>
<span class="k">end</span>
</code></pre>
<p>is similar to</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">if</span> <span class="kp">false</span>
<span class="nb">puts</span> <span class="s2">"!!!!1"</span>
<span class="k">elsif</span> <span class="mi">1</span><span class="o">==</span><span class="mi">2</span>
<span class="nb">puts</span> <span class="s2">"!!!!2"</span>
<span class="k">elsif</span> <span class="p">(</span><span class="nb">puts</span> <span class="s2">"!!!!3"</span><span class="p">)</span>
<span class="k">else</span> <span class="p">(</span><span class="nb">puts</span> <span class="s2">"!!!!4"</span><span class="p">)</span>
<span class="k">end</span>
</code></pre>
<p>Probably Ruby should be more strict in those cases because such code is more prone to bugs.</p>
Ruby master - Feature #15863 (Rejected): Add `Hash#slice!` and `ENV.slice!`
https://bugs.ruby-lang.org/issues/15863
2019-05-19T18:54:06Z
bogdanvlviv (Bogdan Denkovych)
<h2>Add <code>Hash#slice!</code>
</h2>
<p>In <a href="https://bugs.ruby-lang.org/issues/8499" class="external">https://bugs.ruby-lang.org/issues/8499</a> we added <code>Hash#slice</code>.</p>
<p><code>Hash#slice!</code> removes and returns the key/value pairs matching the given keys:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">h</span> <span class="o">=</span> <span class="p">{</span><span class="ss">a: </span><span class="mi">100</span><span class="p">,</span> <span class="ss">b: </span><span class="mi">200</span><span class="p">,</span> <span class="ss">c: </span><span class="mi">300</span><span class="p">}</span>
<span class="n">h</span><span class="p">.</span><span class="nf">slice!</span><span class="p">(</span><span class="ss">:a</span><span class="p">)</span> <span class="c1"># => {:a=>100}</span>
<span class="n">h</span> <span class="c1"># => {:b=>200, :c=>300}</span>
<span class="n">h</span><span class="p">.</span><span class="nf">slice!</span><span class="p">(</span><span class="ss">:b</span><span class="p">,</span> <span class="ss">:c</span><span class="p">,</span> <span class="ss">:d</span><span class="p">)</span> <span class="c1"># => {:b=>200, :c=>300}</span>
<span class="n">h</span> <span class="c1"># => {}</span>
</code></pre>
<p>Note that, this method reflects the behavior of Active Support's<br>
<code>Hash#extract!</code> method that was added in 2009, see<br>
<a href="https://github.com/rails/rails/commit/8dcf91ca113579646e95b0fd7a864dfb6512a53b" class="external">https://github.com/rails/rails/commit/8dcf91ca113579646e95b0fd7a864dfb6512a53b</a></p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">h</span> <span class="o">=</span> <span class="p">{</span><span class="ss">a: </span><span class="mi">100</span><span class="p">,</span> <span class="ss">b: </span><span class="mi">200</span><span class="p">,</span> <span class="ss">c: </span><span class="mi">300</span><span class="p">}</span>
<span class="n">h</span><span class="p">.</span><span class="nf">extract!</span><span class="p">(</span><span class="ss">:a</span><span class="p">)</span> <span class="c1"># => {:a=>100}</span>
<span class="n">h</span> <span class="c1"># => {:b=>200, :c=>300}</span>
<span class="n">h</span><span class="p">.</span><span class="nf">extract!</span><span class="p">(</span><span class="ss">:b</span><span class="p">,</span> <span class="ss">:c</span><span class="p">,</span> <span class="ss">:d</span><span class="p">)</span> <span class="c1"># => {:b=>200, :c=>300}</span>
<span class="n">h</span> <span class="c1"># => {}</span>
</code></pre>
<p>(There is a proposal to add <code>Hash#extract</code> to Ruby - <a href="https://bugs.ruby-lang.org/issues/15831" class="external">https://bugs.ruby-lang.org/issues/15831</a>, but it has another method signature)</p>
<p>Active Support also has <code>Hash#slice!</code>, see <a href="https://api.rubyonrails.org/v5.2/classes/Hash.html#method-i-slice-21" class="external">https://api.rubyonrails.org/v5.2/classes/Hash.html#method-i-slice-21</a>.<br>
It is quite different what this patch proposes, see how it works:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">h</span> <span class="o">=</span> <span class="p">{</span><span class="ss">a: </span><span class="mi">100</span><span class="p">,</span> <span class="ss">b: </span><span class="mi">200</span><span class="p">,</span> <span class="ss">c: </span><span class="mi">300</span><span class="p">}</span>
<span class="n">h</span><span class="p">.</span><span class="nf">slice!</span><span class="p">(</span><span class="ss">:a</span><span class="p">)</span> <span class="c1"># => {:b=>200, :c=>300} # AS Hash#slice!</span>
<span class="n">h</span> <span class="c1"># => {:a=>100}</span>
<span class="n">h</span><span class="p">.</span><span class="nf">slice!</span><span class="p">(</span><span class="ss">:b</span><span class="p">,</span> <span class="ss">:c</span><span class="p">,</span> <span class="ss">:d</span><span class="p">)</span> <span class="c1"># => {:a=>100} # AS Hash#slice!</span>
<span class="n">h</span> <span class="c1"># => {}</span>
</code></pre>
<p>I think <code>Hash#slice!</code> in Ruby should work in the same way as <code>Hash#extract!</code> from Active Support,<br>
there is one argument:</p>
<ul>
<li>
<a href="https://bugs.ruby-lang.org/issues/8499#note-31" class="external">https://bugs.ruby-lang.org/issues/8499#note-31</a><br>
It should behave in the way <code>Hash#slice</code> does, except one thing<br>
<code>Hash#slice!</code> modifies the object. (See, for instance, how <code>Array#slice</code> and<br>
<code>Array#slice!</code> work, they return the same value)</li>
</ul>
<p>But I would like to discuss it more to choose the right behavior for the<br>
proposed method. (Maybe there are good arguments why we should add <code>Hash#slice!</code><br>
with behavior as it is in Active Support)</p>
<h2>Add <code>ENV.slice!</code>
</h2>
<p>The method removes and returns the key/value pairs matching the given keys.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">ENV</span><span class="p">.</span><span class="nf">slice!</span><span class="p">(</span><span class="s2">"PORT"</span><span class="p">,</span> <span class="s2">"RAILS_ENV"</span><span class="p">)</span> <span class="c1"># => {"PORT"=>"3000", "RAILS_ENV"=>"development"}</span>
</code></pre>
<p>Pull Request: <a href="https://github.com/ruby/ruby/pull/2195" class="external">https://github.com/ruby/ruby/pull/2195</a><br>
Patch: <a href="https://patch-diff.githubusercontent.com/raw/ruby/ruby/pull/2195.patch" class="external">https://patch-diff.githubusercontent.com/raw/ruby/ruby/pull/2195.patch</a></p>
Ruby master - Feature #15831 (Rejected): Add `Array#extract`, `Hash#extract`, and `ENV.extract`
https://bugs.ruby-lang.org/issues/15831
2019-05-05T20:52:01Z
bogdanvlviv (Bogdan Denkovych)
<h2>Add <code>Array#extract</code>
</h2>
<p>The method removes and returns the elements for which the block returns a true value.<br>
If no block is given, an Enumerator is returned instead.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">numbers</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">]</span>
<span class="n">odd_numbers</span> <span class="o">=</span> <span class="n">numbers</span><span class="p">.</span><span class="nf">extract</span> <span class="p">{</span> <span class="o">|</span><span class="n">number</span><span class="o">|</span> <span class="n">number</span><span class="p">.</span><span class="nf">odd?</span> <span class="p">}</span> <span class="c1"># => [1, 3, 5, 7, 9]</span>
<span class="n">numbers</span> <span class="c1"># => [0, 2, 4, 6, 8]</span>
</code></pre>
<p>This method was added to Active Support as <code>extract!</code> in <a href="https://github.com/rails/rails/pull/33137" class="external">https://github.com/rails/rails/pull/33137</a></p>
<p>In this post, you can find use cases of this method<br>
<a href="https://bogdanvlviv.com/posts/ruby/rails/array-extract-to-activesupport-6-0.html" class="external">https://bogdanvlviv.com/posts/ruby/rails/array-extract-to-activesupport-6-0.html</a></p>
<h2>Add <code>Hash#extract</code>
</h2>
<p>The method removes and returns the key/value pairs for which the block evaluates to +true+.<br>
If no block is given, an Enumerator is returned instead.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">h</span> <span class="o">=</span> <span class="p">{</span><span class="ss">a: </span><span class="mi">100</span><span class="p">,</span> <span class="ss">b: </span><span class="mi">200</span><span class="p">,</span> <span class="ss">c: </span><span class="mi">300</span><span class="p">}</span>
<span class="n">h</span><span class="p">.</span><span class="nf">extract</span> <span class="p">{</span><span class="o">|</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="o">|</span> <span class="n">v</span> <span class="o">></span> <span class="mi">150</span><span class="p">}</span> <span class="c1"># => {:b=>200, :c=>300}</span>
<span class="n">h</span> <span class="c1"># => {:a=>100}</span>
</code></pre>
<p>Note that there is method <code>extract!</code> in Active Support that was added in 2009, see<br>
<a href="https://github.com/rails/rails/commit/8dcf91ca113579646e95b0fd7a864dfb6512a53b" class="external">https://github.com/rails/rails/commit/8dcf91ca113579646e95b0fd7a864dfb6512a53b</a><br>
But I think we should upstream <code>extract!</code> to Ruby as <code>slice!</code>.</p>
<h2>Add <code>ENV.extract</code>
</h2>
<p>The method removes and returns the key/value pairs for which the block evaluates to +true+.<br>
If no block is given, an Enumerator is returned instead.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="no">ENV</span><span class="p">.</span><span class="nf">extract</span> <span class="p">{</span><span class="o">|</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="o">|</span> <span class="n">k</span> <span class="o">==</span> <span class="s2">"PORT"</span><span class="p">}</span> <span class="c1"># => {"PORT"=>"3000"}</span>
</code></pre>
<p>Pull Request: <a href="https://github.com/ruby/ruby/pull/2171" class="external">https://github.com/ruby/ruby/pull/2171</a><br>
Patch: <a href="https://patch-diff.githubusercontent.com/raw/ruby/ruby/pull/2171.patch" class="external">https://patch-diff.githubusercontent.com/raw/ruby/ruby/pull/2171.patch</a></p>