https://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17113305112020-09-26T13:20:43ZRuby Issue Tracking SystemRuby master - Feature #17195: Freeze Enumerator::ArithmeticSequence objectshttps://bugs.ruby-lang.org/issues/17195?journal_id=877472020-09-26T13:20:43ZEregon (Benoit Daloze)
<ul><li><strong>Related to</strong> <i><a class="issue tracker-2 status-5 priority-4 priority-default closed" href="/issues/15504">Feature #15504</a>: Freeze all Range objects</i> added</li></ul> Ruby master - Feature #17195: Freeze Enumerator::ArithmeticSequence objectshttps://bugs.ruby-lang.org/issues/17195?journal_id=877522020-09-26T18:44:08Zmarcandre (Marc-Andre Lafortune)marcandre-ruby-core@marc-andre.ca
<ul></ul><p>Seems clear to me</p> Ruby master - Feature #17195: Freeze Enumerator::ArithmeticSequence objectshttps://bugs.ruby-lang.org/issues/17195?journal_id=877582020-09-27T10:05:13ZEregon (Benoit Daloze)
<ul></ul><p>I just realized, this is problematic because <code>Enumerator::ArithmeticSequence</code> is a subclass of <code>Enumerator</code> and not of <code>Range</code>.<br>
If it was a subclass of Range then I think it would be fine to freeze it.</p>
<p>But since it subclasses Enumerator, it has mutating methods like <code>Enumerator#next</code>:</p>
<pre><code class="ruby syntaxhl" data-language="ruby"><span class="p">[</span><span class="mi">7</span><span class="p">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">></span> <span class="n">enum</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="o">..</span><span class="mi">5</span><span class="p">).</span><span class="nf">step</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="o">=></span> <span class="p">((</span><span class="mi">1</span><span class="o">..</span><span class="mi">5</span><span class="p">).</span><span class="nf">step</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
<span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">></span> <span class="n">enum</span><span class="p">.</span><span class="nf">next</span>
<span class="o">=></span> <span class="mi">1</span>
<span class="p">[</span><span class="mi">9</span><span class="p">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">></span> <span class="n">enum</span><span class="p">.</span><span class="nf">next</span>
<span class="o">=></span> <span class="mi">3</span>
<span class="p">[</span><span class="mi">10</span><span class="p">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">></span> <span class="n">enum</span><span class="p">.</span><span class="nf">next</span>
<span class="o">=></span> <span class="mi">5</span>
<span class="p">[</span><span class="mi">11</span><span class="p">]</span> <span class="n">pry</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="o">></span> <span class="n">enum</span><span class="p">.</span><span class="nf">next</span>
<span class="no">StopIteration</span><span class="p">:</span> <span class="n">iteration</span> <span class="n">reached</span> <span class="n">an</span> <span class="k">end</span>
<span class="n">from</span> <span class="p">(</span><span class="n">pry</span><span class="p">):</span><span class="mi">11</span><span class="ss">:in</span> <span class="sb">`next'
</span></code></pre>
<p><a class="user active user-mention" href="https://bugs.ruby-lang.org/users/482">@mrkn (Kenta Murata)</a> do you remember why ArithmeticSequence is an Enumerator subclass and not a Range subclass?</p> Ruby master - Feature #17195: Freeze Enumerator::ArithmeticSequence objectshttps://bugs.ruby-lang.org/issues/17195?journal_id=879582020-10-09T08:01:34Zmrkn (Kenta Murata)muraken@gmail.com
<ul></ul><p>The reason why ArithmeticSequence is a subclass of Enumerator is for conserving the compatibility of the return types of <code>Range#step</code> and <code>Numeric#step</code>.</p> Ruby master - Feature #17195: Freeze Enumerator::ArithmeticSequence objectshttps://bugs.ruby-lang.org/issues/17195?journal_id=879622020-10-09T18:15:36ZEregon (Benoit Daloze)
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Rejected</i></li></ul><p>Right, that makes sense, thanks for the reply.</p>
<p>Interestingly it seems <code>Enumerator#next</code> is still allowed even if the Enumerator is frozen, even though it is a kind of mutation.<br>
I think that's a bug.</p>
<p>Given <code>ArithmeticSequence</code> has state through being an Enumerator, I think it's not reasonable to freeze, so I'll reject this issue.</p>