From: merch-redmine@... Date: 2021-04-29T19:02:45+00:00 Subject: [ruby-core:103666] [Ruby master Bug#17841] The first instance of SortedSet doesn't sort when rbtree is present Issue #17841 has been updated by jeremyevans0 (Jeremy Evans). Backport changed from 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN to 2.6: DONTNEED, 2.7: REQUIRED, 3.0: DONTNEED Status changed from Open to Closed 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. ---------------------------------------- Bug #17841: The first instance of SortedSet doesn't sort when rbtree is present https://bugs.ruby-lang.org/issues/17841#change-91760 * 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: REQUIRED, 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: