This is not a bug, IMO. Using underlying functions instead of calling methods was one of the deliberate design decisions for core Set (see #21216), and how other core collection classes work. Array.new(1, true) does not call Array#[]=, it calls rb_ary_store.
If we want to do this for Set#initialize and Set.[] for backwards compatibility, we should be consistent and call methods instead of underlying functions for every case where the methods were called in stdlib set. That will make it slower, though.
FWIW, in the code path you are using in stdlib Set, Set#add is not called directly, you are relying on Set#merge calling it. So this is at least a request to have Set#initialize call Set#merge and to have Set#merge call Set#add for every element.
This is not a bug, IMO. Using underlying functions instead of calling methods was one of the deliberate design decisions for core Set (see #21216), and how other core collection classes work. Array.new(1, true) does not call Array#[]=, it calls rb_ary_store.
If we want to do this for Set#initialize and Set.[] for backwards compatibility, we should be consistent and call methods instead of underlying functions for every case where the methods were called in stdlib set. That will make it slower, though.
FWIW, in the code path you are using in stdlib Set, Set#add is not called directly, you are relying on Set#merge calling it. So this is at least a request to have Set#initialize call Set#merge and to have Set#merge call Set#add for every element.
I don't have an opinion, really. But this change in behavior is breaking our existing code, and I suspect we're not the only ones.
Is there any public code in some gem or so that relies on this? (the example is rather synthetic)
It's kind of hard to search for this on GitHub, but I was able to find two similar-ish examples:
This one would not raise an exception in the same way, and this one could potentially be missing entries from its @hash_lookup instance variable.
Maybe we could publish a gem that just has a copy of the current set.rb file, but with Set renamed to RbSet or something. Then if people run in to issues they can use the gem and change the superclass to RbSet. I think it would fix our case at work and probably the cases referenced above. I agree with @jeremyevans0's points, but I'm sure this is going to cause friction for people upgrading and it would be nice if we can make it as easy as possible to upgrade.