summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-10-22 12:25:34 +0000
committerknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-10-22 12:25:34 +0000
commit8c90432af72a59d8934b2c94a1bc847449e1f393 (patch)
tree2c50ce486548899b86a3cb114c93c1333de18be2 /lib
parent6693e3e7230ca64b01ffb24d2693af1c77bd2998 (diff)
Add `Set#reset`
This method resets the internal state of a set after modification to existing elements, reindexing and deduplicating them. [Feature #6589] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60360 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r--lib/set.rb18
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/set.rb b/lib/set.rb
index b668738ebb..5da196d1e0 100644
--- a/lib/set.rb
+++ b/lib/set.rb
@@ -477,6 +477,19 @@ class Set
@hash.eql?(o.instance_variable_get(:@hash))
end
+ # Resets the internal state after modification to existing elements
+ # and returns self.
+ #
+ # Elements will be reindexed and deduplicated.
+ def reset
+ if @hash.respond_to?(:rehash)
+ @hash.rehash # This should perform frozenness check.
+ else
+ raise "can't modify frozen #{self.class.name}" if frozen?
+ end
+ self
+ end
+
# Returns true if obj is a member of the set, and false otherwise.
#
# Used in case statements:
@@ -731,6 +744,11 @@ class SortedSet < Set
to_a
super
end
+
+ def rehash
+ @keys = nil
+ super
+ end
END
end
# a hack to shut up warning