Project

General

Profile

Actions

Bug #21513

open

Converting endless range to set hangs

Added by viralpraxis (Iaroslav Kurbatov) 1 day ago. Updated about 11 hours ago.

Status:
Open
Assignee:
-
Target version:
-
[ruby-core:122773]

Description

Converting endless range to array raises:

ruby -e '(1..).to_a'
-e:1:in 'Range#to_a': cannot convert endless range to an array (RangeError)
	from -e:1:in '<main>'

but converting to set does not:

ruby -e '(1..).to_set # hangs'

I think it makes to raise in both cases for consistency. Something like this should do the trick:

diff --git i/prelude.rb w/prelude.rb
index f49cada637..11bfa3fc95 100644
--- i/prelude.rb
+++ w/prelude.rb
@@ -30,6 +30,10 @@ module Enumerable
   # Makes a set from the enumerable object with given arguments.
   # Passing arguments to this method is deprecated.
   def to_set(*args, &block)
+    if self.class == Range && self.end.nil?
+      raise RangeError, "cannot convert endless range to a set"
+    end
+
     klass = if args.empty?
       Set
     else
diff --git i/test/ruby/test_range.rb w/test/ruby/test_range.rb
index f875c0ab40..27b968641b 100644
--- i/test/ruby/test_range.rb
+++ w/test/ruby/test_range.rb
@@ -1541,4 +1541,11 @@ def test_overlap?
     assert_not_operator((1...3), :overlap?, (3..4))
     assert_not_operator((...3), :overlap?, (3..))
   end
+
+  def test_to_set
+    assert_equal(Set[], (1..-1).to_set)
+    assert_equal(Set[1, 2, 3], (1..3).to_set)
+
+    assert_raise(RangeError) { (239..).to_set }
+  end
 end

If this patch is accepted, I'll open a PR.

./ruby -v
ruby 3.5.0dev (2025-07-14T20:34:32Z master a6d483971a) +PRISM [x86_64-linux]
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0