https://bugs.ruby-lang.org/https://bugs.ruby-lang.org/favicon.ico?17113305112018-06-13T08:06:52ZRuby Issue Tracking SystemRuby master - Bug #14845: Endless Range with nilhttps://bugs.ruby-lang.org/issues/14845?journal_id=724782018-06-13T08:06:52Zmame (Yusuke Endoh)mame@ruby-lang.org
<ul></ul><p>現状の挙動はそれはそれで便利そう※なので、early failure と便利さとのトレードオフです。どっちがいいでしょうね。</p>
<p>※たとえば SQL の DSL で <code>count: (min..max)</code> という Range を書いたとき、<code>max = nil</code> にするだけで「上限なし」を表現できるという使い方が考えられます。<code>(1..nil)</code> がエラーになると、<code>count: max ? (min..max) : (min..)</code> とかいう記述が必要になり、DSL としては終了です。</p>
<p>問題を <code>to_a</code> に限れば、<code>(1..nil).to_a</code> や <code>enum.cycle.to_a</code> のように、明らかに停止しない <code>to_a</code> 呼び出しを例外にするという解決もありえると思います(「明らかに停止しない」が本当に正しいかどうか自信が持てないところですが)。</p>
<p>うっかり <code>(1..nil)</code> を作ってしまったというリアルな例などがあると、議論が捗りそうです。</p> Ruby master - Bug #14845: Endless Range with nilhttps://bugs.ruby-lang.org/issues/14845?journal_id=724792018-06-13T09:05:37Zmame (Yusuke Endoh)mame@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li></ul><p>Applied in changeset trunk|r63646.</p>
<hr>
<p>range.c: prohibit <code>(1..nil)</code></p>
<p>Now endless range can be created by either a literal <code>(1..)</code> or explicit<br>
range creation <code>Range.new(1, nil)</code>. [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Endless Range with nil (Closed)" href="https://bugs.ruby-lang.org/issues/14845">#14845</a>]</p>
<p>This change is intended for "early failure"; for example,<br>
<code>(1..var).to_a</code> causes out of memory if <code>var</code> is inadvertently nil.</p> Ruby master - Bug #14845: Endless Range with nilhttps://bugs.ruby-lang.org/issues/14845?journal_id=724802018-06-13T09:06:49Zmame (Yusuke Endoh)mame@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Closed</i> to <i>Assigned</i></li><li><strong>Assignee</strong> set to <i>matz (Yukihiro Matsumoto)</i></li></ul><p><a href="https://twitter.com/yukihiro_matz/status/1006737384820445184" class="external">https://twitter.com/yukihiro_matz/status/1006737384820445184</a></p>
<blockquote>
<p>いやあ、エラーではねた方がいいんじゃないですかね。</p>
</blockquote>
<p>ていうのがあったので、とりあえず r63646 で <code>(1..nil)</code> を禁止しました。ただし <code>Range.new(1, nil)</code> は許しています(そうしないと Range のサブクラスを endless にする手段がないので)。</p>
<p>個人的には、DSL が終了してしまったのと、無駄に複雑になった気がして、あんまり好きじゃないです。次の開発者会議で相談させてください。</p> Ruby master - Bug #14845: Endless Range with nilhttps://bugs.ruby-lang.org/issues/14845?journal_id=724822018-06-13T10:00:51Zmame (Yusuke Endoh)mame@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Closed</i></li></ul><p>Applied in changeset commit:ruby-git|48de2ea5f9b9067779acb0f7f76e5f879f2b42c0.</p>
<hr>
<p>range.c: prohibit <code>(1..nil)</code></p>
<p>Now endless range can be created by either a literal <code>(1..)</code> or explicit<br>
range creation <code>Range.new(1, nil)</code>. [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Endless Range with nil (Closed)" href="https://bugs.ruby-lang.org/issues/14845">#14845</a>]</p>
<p>This change is intended for "early failure"; for example,<br>
<code>(1..var).to_a</code> causes out of memory if <code>var</code> is inadvertently nil.</p>
<p>git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63646 b2dd03c8-39d4-4d8f-98ff-823fe69b080e</p> Ruby master - Bug #14845: Endless Range with nilhttps://bugs.ruby-lang.org/issues/14845?journal_id=724842018-06-13T10:07:57Zmatz (Yukihiro Matsumoto)matz@ruby.or.jp
<ul></ul><p>I meant <code>(1..).to_a</code> to raise an exception (for apparent infinity loop), not prohibiting <code>1..nil</code>'.</p>
<p>Matz.</p> Ruby master - Bug #14845: Endless Range with nilhttps://bugs.ruby-lang.org/issues/14845?journal_id=724852018-06-13T11:01:19Zmame (Yusuke Endoh)mame@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Closed</i> to <i>Assigned</i></li></ul><p>matz (Yukihiro Matsumoto) wrote:</p>
<blockquote>
<p>I meant <code>(1..).to_a</code> to raise an exception (for apparent infinity loop), not prohibiting <code>1..nil</code>'.</p>
<p>Matz.</p>
</blockquote>
<p>Sorry for my misunderstanding. I reverted r63646.</p> Ruby master - Bug #14845: Endless Range with nilhttps://bugs.ruby-lang.org/issues/14845?journal_id=724862018-06-13T11:20:52Zmame (Yusuke Endoh)mame@ruby-lang.org
<ul><li><strong>File</strong> <a href="/attachments/7201">range_to_a.patch</a> <a class="icon-only icon-download" title="Download" href="/attachments/download/7201/range_to_a.patch">range_to_a.patch</a> added</li></ul><p>I'm attaching a patch for <code>Range#to_a</code> that raises an RangeError for an endless range, and that calls super to <code>Enumerable#to_a</code> for a normal range.</p> Ruby master - Bug #14845: Endless Range with nilhttps://bugs.ruby-lang.org/issues/14845?journal_id=724872018-06-13T15:45:17Zznz (Kazuhiro NISHIYAMA)
<ul></ul><p>別チケットにした方が良いのかもしれませんが、関連するのでここにコメントしておきます。</p>
<p><code>Range.new(1)</code> のように終端を省略できるようにするのはどうでしょうか?<br>
endless range の時は exclude_end を指定できても違いがないようなので、現状では問題がなさそうに思います。</p>
<p>beginless などの可能性を考えるとキーワード引数も受け付けるようにして、 <code>Range.new(begin: 1, endless: true)</code> や <code>Range.new(begin: 1, end: 9, exclude_end: true)</code> のようにかけると良いかもしれません。</p> Ruby master - Bug #14845: Endless Range with nilhttps://bugs.ruby-lang.org/issues/14845?journal_id=726002018-06-22T02:58:44Zmame (Yusuke Endoh)mame@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Assigned</i> to <i>Closed</i></li></ul><p>Applied in changeset trunk|r63714.</p>
<hr>
<p>range.c: Range#to_a now raises RangeError if it is endless</p>
<p>Fixes [Bug <a class="issue tracker-1 status-5 priority-4 priority-default closed" title="Bug: Endless Range with nil (Closed)" href="https://bugs.ruby-lang.org/issues/14845">#14845</a>]</p> Ruby master - Bug #14845: Endless Range with nilhttps://bugs.ruby-lang.org/issues/14845?journal_id=904602021-02-17T11:09:17Zmame (Yusuke Endoh)mame@ruby-lang.org
<ul><li><strong>Related to</strong> <i><a class="issue tracker-5 status-1 priority-4 priority-default" href="/issues/17637">Misc #17637</a>: Endless ranges with `nil` boundary weird behavior</i> added</li></ul>