diff options
author | Akinori MUSHA <knu@idaemons.org> | 2022-02-17 18:02:42 +0900 |
---|---|---|
committer | Akinori MUSHA <knu@idaemons.org> | 2022-02-18 11:56:24 +0900 |
commit | dd3501bb9580951623a9aa7c2f86f7c98f9d6b9c (patch) | |
tree | 5f05faf3bf6f366f988a0f6a9996e4249d97308d | |
parent | 7757ccb5048b964642a0c884906e35c5fab634f3 (diff) | |
download | ruby-dd3501bb9580951623a9aa7c2f86f7c98f9d6b9c.tar.gz |
Make Set a builtin feature [Feature #16989]
-rw-r--r-- | lib/set.rb | 2 | ||||
-rw-r--r-- | prelude.rb | 9 | ||||
-rw-r--r-- | test/test_set.rb | 39 |
3 files changed, 49 insertions, 1 deletions
diff --git a/lib/set.rb b/lib/set.rb index 7832c848cf..852c13a534 100644 --- a/lib/set.rb +++ b/lib/set.rb @@ -854,7 +854,7 @@ module Enumerable # Needs to `require "set"` to use this method. def to_set(klass = Set, *args, &block) klass.new(self, *args, &block) - end + end unless method_defined?(:to_set) end autoload :SortedSet, "#{__dir__}/set/sorted_set" diff --git a/prelude.rb b/prelude.rb index b1e477a3ea..8fd6e6cb77 100644 --- a/prelude.rb +++ b/prelude.rb @@ -20,3 +20,12 @@ module Kernel private :pp end + +autoload :Set, 'set' + +module Enumerable + # Makes a set from the enumerable object with given arguments. + def to_set(klass = Set, *args, &block) + klass.new(self, *args, &block) + end +end diff --git a/test/test_set.rb b/test/test_set.rb index b92930a445..83e28878a0 100644 --- a/test/test_set.rb +++ b/test/test_set.rb @@ -838,3 +838,42 @@ class TC_Enumerable < Test::Unit::TestCase assert_not_same set, set.to_set { |o| o } end end + +class TC_Set_Builtin < Test::Unit::TestCase + private def should_omit? + Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.2.0') || + !File.exist?(File.expand_path('../prelude.rb', __dir__)) + end + + def test_Set + omit "skipping the test for the builtin Set" if should_omit? + + assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}") + begin; + assert_nothing_raised do + set = Set.new([1, 2]) + assert_equal('Set', set.class.name) + end + end; + + assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}") + begin; + assert_nothing_raised do + set = Set[1, 2] + assert_equal('Set', set.class.name) + end + end; + end + + def test_to_set + omit "skipping the test for the builtin Enumerable#to_set" if should_omit? + + assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}") + begin; + assert_nothing_raised do + set = [1, 2].to_set + assert_equal('Set', set.class.name) + end + end; + end +end |