CARVIEW |
Select Language
HTTP/2 200
x-amz-id-2: WfIqFLBNTXGs80EXxtHFVtoGIgc/I8FM6m1bfxkDWcITpq8TdjJw5LVMpQliMpKxsvqEEfS19c4=
x-amz-request-id: 4AQZP5YTQ4DF8KW3
last-modified: Mon, 14 Jul 2025 22:41:17 GMT
etag: "b880feb590e5f402c83ce7350a41b2f7"
x-amz-server-side-encryption: AES256
server: AmazonS3
content-encoding: gzip
via: 1.1 varnish, 1.1 varnish
content-type: text/plain; charset=utf-8
accept-ranges: bytes
age: 0
date: Wed, 23 Jul 2025 20:42:39 GMT
x-served-by: cache-tyo11983-TYO, cache-bom-vanm7210088-BOM
x-cache: MISS, MISS
x-cache-hits: 0, 0
x-timer: S1753303359.750662,VS0,VE316
vary: Accept-Encoding
content-length: 1022
From: "viralpraxis (Iaroslav Kurbatov) via ruby-core"
Date: 2025-07-14T22:36:46+00:00
Subject: [ruby-core:122773] [Ruby Feature#21513] Raise on converting endless range to set
Issue #21513 has been reported by viralpraxis (Iaroslav Kurbatov).
----------------------------------------
Feature #21513: Raise on converting endless range to set
https://bugs.ruby-lang.org/issues/21513
* Author: viralpraxis (Iaroslav Kurbatov)
* Status: Open
----------------------------------------
Converting endless range to array raises:
``` shell
ruby -e '(1..).to_a'
-e:1:in 'Range#to_a': cannot convert endless range to an array (RangeError)
from -e:1:in ''
```
but converting to set does not:
``` shell
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
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.
``` shell
./ruby -v
ruby 3.5.0dev (2025-07-14T20:34:32Z master a6d483971a) +PRISM [x86_64-linux]
```
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/