From 7bc3c79cb1a6a5ac71f01d02ef78f3541471abb9 Mon Sep 17 00:00:00 2001 From: Grzegorz Jakubiak Date: Sat, 15 Feb 2025 23:50:53 +0100 Subject: [PATCH] Introduce Hash#keys_to_set --- lib/set.rb | 13 +++++++++++++ test/test_set.rb | 10 ++++++++++ 2 files changed, 23 insertions(+) diff --git a/lib/set.rb b/lib/set.rb index 86bbe40..f93c193 100644 --- a/lib/set.rb +++ b/lib/set.rb @@ -852,4 +852,17 @@ def to_set(klass = Set, *args, &block) end unless method_defined?(:to_set) end +class Hash + # Returns a new Set containing keys from the Hash + # + # h = {a: 1, b: 3} + # h.keys_to_set #=> Set[:a, :b] + # + def keys_to_set + set = Set.new + set.instance_variable_set(:@hash, transform_values { true }) + set + end +end + autoload :SortedSet, "#{__dir__}/set/sorted_set" diff --git a/test/test_set.rb b/test/test_set.rb index 5659460..7165a62 100644 --- a/test/test_set.rb +++ b/test/test_set.rb @@ -857,6 +857,16 @@ def test_to_set end end +class TC_Hash < Test::Unit::TestCase + def test_keys_to_set + h = {a: 2, b: 1, c: 37} + set = h.keys_to_set + expected = Set.new(h.keys) + + assert_equal(set, expected) + end +end + class TC_Set_Builtin < Test::Unit::TestCase private def should_omit? (RUBY_VERSION.scan(/\d+/).map(&:to_i) <=> [3, 2]) < 0 ||