From: usa@... Date: 2021-07-31T12:29:23+00:00 Subject: [ruby-core:104732] [Ruby master Bug#17841] The first instance of SortedSet doesn't sort when rbtree is present Issue #17841 has been updated by usa (Usaku NAKAMURA). 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 ---------------------------------------- Bug #17841: The first instance of SortedSet doesn't sort when rbtree is present https://bugs.ruby-lang.org/issues/17841#change-93066 * Author: joshc (Josh C) * Status: Closed * Priority: Normal * ruby -v: ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-linux] * Backport: 2.6: DONTNEED, 2.7: DONE, 3.0: DONTNEED ---------------------------------------- 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` -- https://bugs.ruby-lang.org/ Unsubscribe: