https://redmine.ruby-lang.org/
https://redmine.ruby-lang.org/favicon.ico?1711330511
2016-07-25T01:18:49Z
Ruby Issue Tracking System
Ruby master - Feature #12624: !== (other)
https://redmine.ruby-lang.org/issues/12624?journal_id=59785
2016-07-25T01:18:49Z
duerst (Martin Dürst)
duerst@it.aoyama.ac.jp
<ul></ul><p>Eike Dierks wrote:</p>
<blockquote>
<p>I believe, that in some cases<br>
the intention of a boolean clause<br>
would be easier to understand if we had that !== operator<br>
instead of writing !(a===b)</p>
</blockquote>
<p>We usually don't add new features to Ruby just based on 'belief'. If you think there are such use cases, please find them, in actual existing code.</p>
Ruby master - Feature #12624: !== (other)
https://redmine.ruby-lang.org/issues/12624?journal_id=59792
2016-07-26T01:55:48Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul><li><strong>Description</strong> updated (<a title="View differences" href="/journals/59792/diff?detail_id=42005">diff</a>)</li></ul><p>I'm sometimes wanting it, too.</p>
<p>And can find some lines in standard libraries.</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="n">ext</span><span class="o">/</span><span class="n">psych</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">psych</span><span class="o">/</span><span class="n">visitors</span><span class="o">/</span><span class="n">yaml_tree</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">334</span><span class="p">:</span> <span class="k">elsif</span> <span class="ow">not</span> <span class="no">String</span> <span class="o">===</span> <span class="vi">@ss</span><span class="p">.</span><span class="nf">tokenize</span><span class="p">(</span><span class="n">o</span><span class="p">)</span> <span class="ow">or</span> <span class="sr">/\A0[0-7]*[89]/</span> <span class="o">=~</span> <span class="n">o</span>
<span class="n">lib</span><span class="o">/</span><span class="n">irb</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">500</span><span class="p">:</span> <span class="o">!</span><span class="p">(</span><span class="no">SyntaxError</span> <span class="o">===</span> <span class="n">exc</span><span class="p">)</span>
<span class="n">lib</span><span class="o">/</span><span class="n">optparse</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">1353</span><span class="p">:</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="no">String</span> <span class="o">===</span> <span class="n">o</span> <span class="o">||</span> <span class="no">Symbol</span> <span class="o">===</span> <span class="n">o</span><span class="p">))</span> <span class="ow">and</span> <span class="n">o</span><span class="p">.</span><span class="nf">respond_to?</span><span class="p">(</span><span class="ss">:match</span><span class="p">)</span>
<span class="n">lib</span><span class="o">/</span><span class="n">rdoc</span><span class="o">/</span><span class="n">class_module</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">777</span><span class="p">:</span> <span class="o">!</span><span class="p">(</span><span class="no">String</span> <span class="o">===</span> <span class="n">mod</span><span class="p">)</span> <span class="o">&&</span> <span class="vi">@store</span><span class="p">.</span><span class="nf">modules_hash</span><span class="p">[</span><span class="n">mod</span><span class="p">.</span><span class="nf">full_name</span><span class="p">].</span><span class="nf">nil?</span>
<span class="n">lib</span><span class="o">/</span><span class="n">rdoc</span><span class="o">/</span><span class="n">class_module</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">793</span><span class="p">:</span> <span class="o">!</span><span class="p">(</span><span class="no">String</span> <span class="o">===</span> <span class="n">mod</span><span class="p">)</span> <span class="o">&&</span> <span class="vi">@store</span><span class="p">.</span><span class="nf">modules_hash</span><span class="p">[</span><span class="n">mod</span><span class="p">.</span><span class="nf">full_name</span><span class="p">].</span><span class="nf">nil?</span>
<span class="n">lib</span><span class="o">/</span><span class="n">rdoc</span><span class="o">/</span><span class="n">parser</span><span class="o">/</span><span class="n">ruby</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">244</span><span class="p">:</span> <span class="k">break</span> <span class="k">if</span> <span class="n">first_comment_tk_class</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">first_comment_tk_class</span> <span class="o">===</span> <span class="n">tk</span>
<span class="n">lib</span><span class="o">/</span><span class="n">resolv</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">534</span><span class="p">:</span> <span class="k">if</span> <span class="n">reply</span><span class="p">.</span><span class="nf">tc</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="ow">not</span> <span class="no">Requester</span><span class="o">::</span><span class="no">TCP</span> <span class="o">===</span> <span class="n">requester</span>
<span class="n">lib</span><span class="o">/</span><span class="n">resolv</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">1028</span><span class="p">:</span> <span class="o">!</span><span class="p">(</span><span class="no">Array</span> <span class="o">===</span> <span class="n">ns_port</span><span class="p">)</span> <span class="o">||</span>
<span class="n">lib</span><span class="o">/</span><span class="n">resolv</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">1030</span><span class="p">:</span> <span class="o">!</span><span class="p">(</span><span class="no">String</span> <span class="o">===</span> <span class="n">ns_port</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">||</span>
<span class="n">lib</span><span class="o">/</span><span class="n">resolv</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">1031</span><span class="p">:</span> <span class="o">!</span><span class="p">(</span><span class="no">Integer</span> <span class="o">===</span> <span class="n">ns_port</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="n">lib</span><span class="o">/</span><span class="n">rubygems</span><span class="o">/</span><span class="n">security</span><span class="o">/</span><span class="n">signer</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">51</span><span class="p">:</span> <span class="vi">@key</span> <span class="ow">and</span> <span class="ow">not</span> <span class="no">OpenSSL</span><span class="o">::</span><span class="no">PKey</span><span class="o">::</span><span class="no">RSA</span> <span class="o">===</span> <span class="vi">@key</span>
<span class="nb">test</span><span class="o">/</span><span class="n">objspace</span><span class="o">/</span><span class="n">test_objspace</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">76</span><span class="p">:</span> <span class="n">assert_empty</span><span class="p">(</span><span class="n">arg</span><span class="p">.</span><span class="nf">select</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="o">!</span><span class="p">(</span><span class="no">Symbol</span> <span class="o">===</span> <span class="n">k</span> <span class="o">&&</span> <span class="no">Integer</span> <span class="o">===</span> <span class="n">v</span><span class="p">)},</span> <span class="n">bug8014</span><span class="p">)</span>
<span class="nb">test</span><span class="o">/</span><span class="n">rinda</span><span class="o">/</span><span class="n">test_rinda</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">212</span><span class="p">:</span> <span class="n">assert</span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">tmpl</span> <span class="o">===</span> <span class="n">ro</span><span class="p">))</span>
<span class="nb">test</span><span class="o">/</span><span class="n">rinda</span><span class="o">/</span><span class="n">test_rinda</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">218</span><span class="p">:</span> <span class="n">assert</span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">tmpl</span> <span class="o">===</span> <span class="n">ro</span><span class="p">))</span>
<span class="nb">test</span><span class="o">/</span><span class="n">rinda</span><span class="o">/</span><span class="n">test_rinda</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">221</span><span class="p">:</span> <span class="n">assert</span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">tmpl</span> <span class="o">===</span> <span class="n">ro</span><span class="p">))</span>
<span class="nb">test</span><span class="o">/</span><span class="n">rinda</span><span class="o">/</span><span class="n">test_rinda</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">230</span><span class="p">:</span> <span class="n">assert</span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">tmpl</span> <span class="o">===</span> <span class="n">ro</span><span class="p">))</span>
<span class="nb">test</span><span class="o">/</span><span class="n">ruby</span><span class="o">/</span><span class="n">test_m17n_comb</span><span class="p">.</span><span class="nf">rb</span><span class="p">:</span><span class="mi">1131</span><span class="p">:</span> <span class="k">if</span> <span class="p">[</span><span class="n">s</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">].</span><span class="nf">all?</span> <span class="p">{</span><span class="o">|</span><span class="n">o</span><span class="o">|</span> <span class="o">!</span><span class="p">(</span><span class="no">String</span> <span class="o">===</span> <span class="n">o</span><span class="p">)</span> <span class="o">||</span> <span class="n">o</span><span class="p">.</span><span class="nf">valid_encoding?</span> <span class="p">}</span>
</code></pre>
<p><a href="https://github.com/ruby/ruby/compare/trunk...nobu:feature/!==" class="external">https://github.com/ruby/ruby/compare/trunk...nobu:feature/!==</a></p>
Ruby master - Feature #12624: !== (other)
https://redmine.ruby-lang.org/issues/12624?journal_id=59813
2016-07-27T18:04:00Z
shevegen (Robert A. Heiler)
shevegen@gmail.com
<ul></ul><p>I don't have any particular strong pro or con opinion here, but I should like to note that my bad eyes have it not so easy to distinguish between = == != =! !== ==!.</p>
<p>I actually think that !(String === mod) may be easier to read than (String !== mod) - the amount of characters saved is very negligible.</p>
<p>But it is just an opinion, as said, I have neither strong pro or con opinion on it really.</p>
Ruby master - Feature #12624: !== (other)
https://redmine.ruby-lang.org/issues/12624?journal_id=60015
2016-08-09T14:33:51Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Rejected</i></li></ul><p>The explicit use of <code>===</code> for type checking is against duck typing principle.<br>
I don't accept syntax enhancement proposal to encourage something against duck typing in Ruby.</p>
<p>Matz.</p>
Ruby master - Feature #12624: !== (other)
https://redmine.ruby-lang.org/issues/12624?journal_id=84184
2020-02-06T20:00:39Z
jonathanhefner (Jonathan Hefner)
jonathan@hefner.pro
<ul></ul><p>Recently, I had a use case for this. I was writing an assertion helper method which accepts a comparison operator (e.g. <code>:==</code>, <code>:!=</code>, <code>:===</code>, etc) to <code>send</code> to the expected value. For my use case, having <code>!==</code> would be nice for a few reasons:</p>
<ul>
<li>Can express "assert not expected === actual" without the need for a "refute" method</li>
<li>If defining a "refute" method, can implement it in terms of "assert" using operator inversion lookup table, i.e. <code>{ :== => :!=, :=== => :!==, :< => :>=, ... }</code>
</li>
<li>Error messages can be expressed without special casing, i.e. <code>"Expected: #{expected.inspect} #{op} #{actual.inspect}"</code>
</li>
</ul>