Ruby Issue Tracking System: Issues
https://redmine.ruby-lang.org/
https://redmine.ruby-lang.org/favicon.ico?1711330511
2015-09-18T15:16:27Z
Ruby Issue Tracking System
Redmine
Ruby master - Feature #11538 (Feedback): ensure variable syntax
https://redmine.ruby-lang.org/issues/11538
2015-09-18T15:16:27Z
arimay (yasuhiro arima)
<p>ensure の構文を拡張して、コンテキストの値を受け取れるようにする提案です。<br>
rescue で例外オブジェクトを変数に受けて参照するのと同様に、ensure で結果のオブジェクトを参照します。</p>
<p>ensure '=>' lhs</p>
<p>途中での return による打ち切りなどによって、適切でない値が返ることがあります。<br>
現状でこれを確認するためには、ensure で参照できるようにあらかじめ変数に束縛する必要があります。</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">def</span> <span class="nf">abs</span><span class="p">(</span> <span class="n">arg</span> <span class="p">)</span>
<span class="n">retval</span> <span class="o">=</span> <span class="kp">nil</span>
<span class="k">return</span> <span class="n">retval</span> <span class="o">=</span> <span class="n">arg</span> <span class="k">if</span> <span class="n">arg</span> <span class="o">></span> <span class="mi">0</span>
<span class="k">return</span> <span class="n">retval</span> <span class="o">=</span> <span class="o">-</span><span class="n">arg</span> <span class="k">if</span> <span class="n">arg</span> <span class="o"><</span> <span class="mi">0</span>
<span class="n">retval</span>
<span class="k">ensure</span>
<span class="nb">p</span> <span class="n">retval</span>
<span class="k">end</span>
</code></pre>
<p>これを ensure で変数に束縛できると、記述が簡潔になります。</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">def</span> <span class="nf">bar</span><span class="p">(</span> <span class="n">arg</span> <span class="p">)</span>
<span class="k">return</span> <span class="n">arg</span> <span class="k">if</span> <span class="n">arg</span> <span class="o">></span> <span class="mi">0</span>
<span class="k">return</span> <span class="o">-</span><span class="n">arg</span> <span class="k">if</span> <span class="n">arg</span> <span class="o"><</span> <span class="mi">0</span>
<span class="k">ensure</span> <span class="o">=></span> <span class="n">retval</span>
<span class="nb">p</span> <span class="n">retval</span>
<span class="k">end</span>
</code></pre>
<p>パッチはつくっていませんが、そろそろ締め切りらしいので提案してみます。</p>
Ruby master - Feature #10327 (Open): Bool/False/True module for '==='
https://redmine.ruby-lang.org/issues/10327
2014-10-05T16:09:17Z
arimay (yasuhiro arima)
<p>ruby-core:0237 から始まる Boolean Class の話題で Boolean Module が提案されていました。<br>
それは必要とされているのか?という疑問とともに .true? メソッドなどが議論されていました。</p>
<p>それを読んで、=== メソッドを利用する Bool, False, True Module を書いてみました。<br>
これを使うと case 式で when TrueClass, FalseClass ではなく when Bool と短く書けます。<br>
また、case 式で 偽は when nil, false ではなく when False と書けます。<br>
そして、真は else ではなく when True と書けます。<br>
Bool, False, True という名前にしたのは、短く書きたいことと、リファレンスマニュアルでも使われているためです。</p>
<p>以下の ruby コードとほぼ同じ内容を C で書いた patch を添えます。</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="k">module</span> <span class="nn">Bool</span>
<span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">append_features</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
<span class="k">if</span> <span class="p">((</span><span class="n">m</span> <span class="o">!=</span> <span class="no">FalseClass</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">m</span> <span class="o">!=</span> <span class="no">TrueClass</span><span class="p">))</span>
<span class="k">raise</span> <span class="no">TypeError</span><span class="p">,</span> <span class="s2">"`</span><span class="si">#{</span><span class="n">m</span><span class="p">.</span><span class="nf">name</span><span class="si">}</span><span class="s2">' isn't FalseClass nor TrueClass"</span><span class="p">,</span> <span class="nb">caller</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">end</span>
<span class="k">super</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">class</span> <span class="nc">FalseClass</span>
<span class="kp">include</span> <span class="no">Bool</span>
<span class="k">end</span>
<span class="k">class</span> <span class="nc">TrueClass</span>
<span class="kp">include</span> <span class="no">Bool</span>
<span class="k">end</span>
<span class="k">module</span> <span class="nn">False</span>
<span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">===</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
<span class="n">other</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">||</span> <span class="n">other</span> <span class="o">==</span> <span class="kp">false</span>
<span class="k">end</span>
<span class="k">end</span>
<span class="k">module</span> <span class="nn">True</span>
<span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">===</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
<span class="o">!</span><span class="n">other</span><span class="p">.</span><span class="nf">nil?</span> <span class="o">&&</span> <span class="n">other</span> <span class="o">!=</span> <span class="kp">false</span>
<span class="k">end</span>
<span class="k">end</span>
</code></pre>
<p>以下が実行例です。</p>
<pre><code>$ ./miniruby -e 'class String; include Bool; end;'
-e:1:in `append_features': 'String' isn't FalseClass nor TrueClass (TypeError)
from -e:1:in `include'
from -e:1:in `<class:String>'
from -e:1:in `<main>'
$ ./miniruby -e '[nil, false, true, 0].each {|obj| p obj.class.ancestors}'
[NilClass, Object, Kernel, BasicObject]
[FalseClass, Bool, Object, Kernel, BasicObject]
[TrueClass, Bool, Object, Kernel, BasicObject]
[Fixnum, Integer, Numeric, Comparable, Object, Kernel, BasicObject]
$ ./miniruby -e '[nil, false, true, 0].each {|obj|
case obj
when Bool; p [obj, Bool]
else p [obj, "-"]
end
}'
[nil, "-"]
[false, Bool]
[true, Bool]
[0, "-"]
$ ./miniruby -e '[nil, false, true, 0].each {|obj|
case obj
when False; p [obj, false]
when True; p [obj, true]
else p [obj, "-"]
end
}'
[nil, false]
[false, false]
[true, true]
[0, true]
</code></pre>
Ruby master - Feature #10287 (Open): rename COLON3 to COLON2_HEAD.
https://redmine.ruby-lang.org/issues/10287
2014-09-23T16:15:00Z
arimay (yasuhiro arima)
<p>主に parse.y を読んでいて、DOT2 に対する DOT3 はわかるのですが、COLON2 に対する COLON3 はよくない名前だと思いました。<br>
COLON3 の表すものは ::FOO::BAR のようにスコープ指定の先頭を表すものなので、COLON2_HEAD としてパッチを作ってみました。</p>