😺

[Bug #21396] Set#initialize で #add が呼ばれなくなったというバグ報告

に公開

[Bug #21396] Set#initialize should call Set#add on items passed in

  • 次のように Set をスーパークラスにしたサブクラスで #add が定義されている場合に開発版の Ruby 3.5-dev から #initialize#add が呼ばれなくなったというバグ報告
class Foo < Set
  def add(item) = super(item.bytesize)
end

x = Foo.new(["foo"])
p x
# Ruby 3.4 => #<Foo: {3}>
# Ruby 3.5 => #<Set: {"foo"}>

p x.include?(3)
# Ruby 3.4 => true
# Ruby 3.5 => false
  • これは Set が標準ライブラリからコアクラスに移動した影響みたいですね
    • もともと Set は Ruby で実装されていたがコアクラスに移動されたことで CRuby の内部処理が直接呼び出されるようになったのが起因
    • 参照: [Feature #21216] Implement Set as a core class
  • これが期待する挙動であるべき、というよりかは互換性を気にしているみたいですね
GitHubで編集を提案

Discussion