Bug #17841
closedThe first instance of SortedSet doesn't sort when rbtree is present
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
Updated by jeremyevans0 (Jeremy Evans) over 3 years ago
- Status changed from Open to Closed
- Backport changed from 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN to 2.6: DONTNEED, 2.7: REQUIRED, 3.0: DONTNEED
This is probably caused by the fix to #15830. Here's a pull request that should fix it: https://github.com/ruby/ruby/pull/4432, though I didn't test with rbtree. Closing and marking for backport.
Updated by usa (Usaku NAKAMURA) over 3 years ago
- Backport changed from 2.6: DONTNEED, 2.7: REQUIRED, 3.0: DONTNEED to 2.6: DONTNEED, 2.7: DONE, 3.0: DONTNEED
merged into ruby_2_7 at 2a7235421fcd59b449c84306d059f22b4c5f0865