From: josh.nw@... Date: 2021-04-29T18:32:43+00:00 Subject: [ruby-core:103664] [Ruby master Bug#17841] The first instance of SortedSet doesn't sort when rbtree is present Issue #17841 has been reported by joshc (Josh C). ---------------------------------------- Bug #17841: The first instance of SortedSet doesn't sort when rbtree is present https://bugs.ruby-lang.org/issues/17841 * Author: joshc (Josh C) * Status: Open * Priority: Normal * ruby -v: ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-linux] * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- 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: