https://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17097754782019-03-22T09:13:10ZRuby Issue Tracking SystemRuby master - Feature #15722: `Kernel#case?`https://bugs.ruby-lang.org/issues/15722?journal_id=772582019-03-22T09:13:10Zosyo (manga osyo)
<ul></ul><p>How about <code>Enumerable#case?</code> ?<br>
Comparing with <code>===</code> like <code>Enumerable#include?</code>.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">bar</span> <span class="c1"># => "bar"</span>
<span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">,</span> <span class="s2">"baz"</span><span class="p">].</span><span class="nf">case?</span> <span class="n">bar</span> <span class="c1"># => true</span>
<span class="p">[</span><span class="s2">"qux"</span><span class="p">].</span><span class="nf">case?</span> <span class="n">bar</span> <span class="c1"># => false</span>
<span class="p">[</span><span class="no">Symbol</span><span class="p">,</span> <span class="no">String</span><span class="p">].</span><span class="nf">case?</span> <span class="n">bar</span> <span class="c1"># => true</span>
<span class="p">[</span><span class="no">Array</span><span class="p">].</span><span class="nf">case?</span> <span class="n">bar</span> <span class="c1"># => false</span>
</code></pre> Ruby master - Feature #15722: `Kernel#case?`https://bugs.ruby-lang.org/issues/15722?journal_id=772602019-03-22T10:04:32Zsawa (Tsuyoshi Sawada)
<ul></ul><p>osyo (manga osyo) wrote:</p>
<blockquote>
<p>How about <code>Enumerable#case?</code> ?<br>
Comparing with <code>===</code> like <code>Enumerable#include?</code>.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">bar</span> <span class="c1"># => "bar"</span>
<span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">,</span> <span class="s2">"baz"</span><span class="p">].</span><span class="nf">case?</span> <span class="n">bar</span> <span class="c1"># => true</span>
<span class="p">[</span><span class="s2">"qux"</span><span class="p">].</span><span class="nf">case?</span> <span class="n">bar</span> <span class="c1"># => false</span>
<span class="p">[</span><span class="no">Symbol</span><span class="p">,</span> <span class="no">String</span><span class="p">].</span><span class="nf">case?</span> <span class="n">bar</span> <span class="c1"># => true</span>
<span class="p">[</span><span class="no">Array</span><span class="p">].</span><span class="nf">case?</span> <span class="n">bar</span> <span class="c1"># => false</span>
</code></pre>
</blockquote>
<p>What is to be evaluated is <code>bar</code>, not the objects that you put in the arrays. <code>bar</code> has to be the receiver. That also matches with how <code>case</code>-construction works. Furthermore, having an array as in your proposal requires additional array to be created, which will be immediately disposed.</p> Ruby master - Feature #15722: `Kernel#case?`https://bugs.ruby-lang.org/issues/15722?journal_id=772742019-03-22T16:25:58Zsawa (Tsuyoshi Sawada)
<ul></ul><p>If such method, if any, should be rather defined on <code>Object</code>, that would be fine. I was not sure whether I should have requested this for <code>Kernel</code> or for <code>Object</code>.</p> Ruby master - Feature #15722: `Kernel#case?`https://bugs.ruby-lang.org/issues/15722?journal_id=772762019-03-22T17:11:55Zshevegen (Robert A. Heiler)shevegen@gmail.com
<ul></ul><p>This is an interesting idea. I have not thought through all implications but not withholding<br>
that, I like it so +1 from me. I think matz has to decide whether this may be useful. Since<br>
I love <code>case</code>/<code>when</code> in ruby in general, any extension, even secondary ideas, seem useful to me. :)<br>
Although I have to admit, I am not sure if I yet had a use case as suggested by sawa, but I<br>
still think it is a good idea.</p>
<p>I think whether it is on <code>Kernel</code> or <code>Object</code> or <code>Enumerable</code> is not the primary concern (that can<br>
be decided anyway) - if matz is too busy right now then perhaps this could be suggested for<br>
the next developer meeting to get more feedback.</p>
<p>I did not know about Rails in?, but I do not like the name "in?". I have no problem with<br>
"case?".</p>
<p>One possible question from the core team might be whether the use case is sufficient (for<br>
many ruby users). I can not answer that myself, to be honest, if that question would come<br>
up - but I still like the idea.</p>
<p>PS: I almost overlooked the comment by osyo; I agree, that is a different suggestion so<br>
I was confused for a moment. The original suggestion by sawa is clearer IMO and more<br>
appropriate (to the proposed suggestion); wording it like:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="p">[</span><span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">,</span> <span class="s2">"baz"</span><span class="p">].</span><span class="nf">case?</span> <span class="n">bar</span>
</code></pre>
<p>would be different, and is actually a bit confusing to me. So it should best be ignored;<br>
sawa's original description is clearer and makes more sense to me, but this is just an<br>
aside - I only was confused for a moment when I read the second code part by osyo.</p> Ruby master - Feature #15722: `Kernel#case?`https://bugs.ruby-lang.org/issues/15722?journal_id=841552020-02-04T10:39:57Zsawa (Tsuyoshi Sawada)
<ul><li><strong>Description</strong> updated (<a title="View differences" href="/journals/84155/diff?detail_id=56304">diff</a>)</li></ul> Ruby master - Feature #15722: `Kernel#case?`https://bugs.ruby-lang.org/issues/15722?journal_id=843922020-02-27T04:51:04Zosyo (manga osyo)
<ul></ul><p>What about using <code>#when?</code> instead of <code>#case?</code>?</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">bar</span> <span class="c1"># => "bar"</span>
<span class="n">flag1</span> <span class="o">=</span> <span class="k">case</span> <span class="n">bar</span><span class="p">;</span> <span class="k">when</span> <span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">,</span> <span class="s2">"baz"</span><span class="p">;</span> <span class="kp">true</span><span class="p">;</span> <span class="k">end</span> <span class="c1"># => true</span>
<span class="n">flag2</span> <span class="o">=</span> <span class="k">case</span> <span class="n">bar</span><span class="p">;</span> <span class="k">when</span> <span class="no">Symbol</span><span class="p">,</span> <span class="no">String</span><span class="p">;</span> <span class="kp">true</span><span class="p">;</span> <span class="k">end</span> <span class="c1"># => true</span>
<span class="c1"># Proposal by sawa</span>
<span class="n">flag1</span> <span class="o">=</span> <span class="n">bar</span><span class="p">.</span><span class="nf">case?</span> <span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">,</span> <span class="s2">"baz"</span> <span class="c1"># => true</span>
<span class="n">flag2</span> <span class="o">=</span> <span class="n">bar</span><span class="p">.</span><span class="nf">case?</span> <span class="no">Symbol</span><span class="p">,</span> <span class="no">String</span> <span class="c1"># => true</span>
<span class="c1"># Proposal by osyo</span>
<span class="n">flag1</span> <span class="o">=</span> <span class="n">bar</span><span class="p">.</span><span class="nf">when?</span> <span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">,</span> <span class="s2">"baz"</span> <span class="c1"># => true</span>
<span class="n">flag2</span> <span class="o">=</span> <span class="n">bar</span><span class="p">.</span><span class="nf">when?</span> <span class="no">Symbol</span><span class="p">,</span> <span class="no">String</span> <span class="c1"># => true</span>
</code></pre>
<p>I think this is closer to the syntax of <code>case when</code>.<br>
And what about adding a oneline <code>when</code> like a oneline <code>in</code> ?</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">bar</span> <span class="c1"># => "bar"</span>
<span class="n">flag1</span> <span class="o">=</span> <span class="k">case</span> <span class="n">bar</span><span class="p">;</span> <span class="k">when</span> <span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">,</span> <span class="s2">"baz"</span><span class="p">;</span> <span class="kp">true</span><span class="p">;</span> <span class="k">end</span> <span class="c1"># => true</span>
<span class="n">flag2</span> <span class="o">=</span> <span class="k">case</span> <span class="n">bar</span><span class="p">;</span> <span class="k">when</span> <span class="no">Symbol</span><span class="p">,</span> <span class="no">String</span><span class="p">;</span> <span class="kp">true</span><span class="p">;</span> <span class="k">end</span> <span class="c1"># => true</span>
<span class="n">flag1</span> <span class="o">=</span> <span class="n">bar</span> <span class="k">when</span> <span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">,</span> <span class="s2">"baz"</span> <span class="c1"># => true</span>
<span class="n">flag2</span> <span class="o">=</span> <span class="n">bar</span> <span class="k">when</span> <span class="no">Symbol</span><span class="p">,</span> <span class="no">String</span> <span class="c1"># => true</span>
</code></pre> Ruby master - Feature #15722: `Kernel#case?`https://bugs.ruby-lang.org/issues/15722?journal_id=843962020-02-27T05:54:10Zmatz (Yukihiro Matsumoto)matz@ruby.or.jp
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Feedback</i></li></ul><p>It is not obvious to me that <code>#case?</code> is useful. We need a real-world use-case.</p>
<ul>
<li>I don't like the name <code>case?</code>
</li>
<li>IMO, just use <code>case</code> statement</li>
</ul>
<p>Matz.</p> Ruby master - Feature #15722: `Kernel#case?`https://bugs.ruby-lang.org/issues/15722?journal_id=844352020-02-29T07:25:31Znobu (Nobuyoshi Nakada)nobu@ruby-lang.org
<ul></ul><p>osyo (manga osyo) wrote in <a href="#note-6">#note-6</a>:</p>
<blockquote>
<p>I think this is closer to the syntax of <code>case when</code>.<br>
And what about adding a oneline <code>when</code> like a oneline <code>in</code> ?</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">bar</span> <span class="c1"># => "bar"</span>
<span class="n">flag1</span> <span class="o">=</span> <span class="k">case</span> <span class="n">bar</span><span class="p">;</span> <span class="k">when</span> <span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">,</span> <span class="s2">"baz"</span><span class="p">;</span> <span class="kp">true</span><span class="p">;</span> <span class="k">end</span> <span class="c1"># => true</span>
<span class="n">flag2</span> <span class="o">=</span> <span class="k">case</span> <span class="n">bar</span><span class="p">;</span> <span class="k">when</span> <span class="no">Symbol</span><span class="p">,</span> <span class="no">String</span><span class="p">;</span> <span class="kp">true</span><span class="p">;</span> <span class="k">end</span> <span class="c1"># => true</span>
<span class="n">flag1</span> <span class="o">=</span> <span class="n">bar</span> <span class="k">when</span> <span class="s2">"foo"</span><span class="p">,</span> <span class="s2">"bar"</span><span class="p">,</span> <span class="s2">"baz"</span> <span class="c1"># => true</span>
<span class="n">flag2</span> <span class="o">=</span> <span class="n">bar</span> <span class="k">when</span> <span class="no">Symbol</span><span class="p">,</span> <span class="no">String</span> <span class="c1"># => true</span>
</code></pre>
</blockquote>
<p>As a <code>case expr</code> statement doesn't need a terminator (newline or semicolon) before <code>when</code>, it conflicts with the current syntax.</p>