Actions
Bug #17841
closedThe first instance of SortedSet doesn't sort when rbtree is present
Bug #17841:
The first instance of SortedSet doesn't sort when rbtree is present
Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-linux]
Description
If the rbtree gem is present, then in ruby 2.7, the first instance of SortedSet will return entries in insertion order. Future instances of SortedSet correctly return sorted entries.
Given:
require 'rbtree'
require 'set'
descending = [2, 1]
s1 = SortedSet.new
descending.each { |i| s1.add(i) }
s2 = SortedSet.new
descending.each { |i| s2.add(i) }
puts s1.to_a == s1.sort.to_a
puts s2.to_a == s2.sort.to_a
It prints:
false
true
It should print:
true
true
The reason for this is because the SortedSet#initialize method monkey patches itself. So the first instance of SortedSet uses the default @hash = {} instead of @hash = RBTree.new, and it doesn't monkey patch the to_a method to sort the hash keys.
This is an issue for anyone adding the sorted_set gem dependency to support both ruby 2 and 3, since the sorted_set gem depends on rbtree
Actions