[ruby-core:122564] [Ruby Bug#21375] Set[] does not call #initialize
From:
"Dan0042 (Daniel DeLorme) via ruby-core" <ruby-core@...>
Date:
2025-06-20 17:37:43 UTC
List:
ruby-core #122564
Issue #21375 has been updated by Dan0042 (Daniel DeLorme).
Ethan (Ethan -) wrote in #note-3:
> My feeling is that the base expectation is that #initialize is called on new objects.
I agree.
`Array[*args]` is equivalent to `Array.new.concat(*args)` and in that case there was no need to call #initialize because it's a no-op when there are no arguments. But the side-effect of that optimization is that `MyArray[*args]` does not call #initialize when it should, and I consider that a bug. It would be better to fix that bug in `Array` rather than introduce it in `Set` just to keep things "consistent".
----------------------------------------
Bug #21375: Set[] does not call #initialize
https://bugs.ruby-lang.org/issues/21375#change-113794
* Author: Ethan (Ethan -)
* Status: Open
* ruby -v: ruby 3.5.0dev (2025-05-26T17:42:35Z master 909a0daab6) +PRISM [x86_64-darwin22]
* Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN
----------------------------------------
I have a subclass of Set that overrides #initialize. Following #21216, .new does call #initialize but .[] does not.
```ruby
class MySet < Set
def initialize(enum = nil)
compare_by_identity
super
end
end
MySet.new.compare_by_identity?
# => true
MySet[].compare_by_identity?
# => false
```
--
https://bugs.ruby-lang.org/
______________________________________________
ruby-core mailing list -- ruby-core@ml.ruby-lang.org
To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/