2022/06/23 今回の気になった bugs.ruby のチケット
今週はトップレベルで include
したあとにクラス定義すると予期しないクラスを再オープンするというバグ報告がありました。
[Feature #18832] Do not have class/module keywords consider ancestors of Object
- 次のように
include M
した後にC < String
を定義すると意図しないエラーになるバグ報告M::C
とトップレベルのC
は別のクラスとして扱われることを期待する
module M class C end end include M # C は定義されていない p Object.const_defined?(:C, false) # => false # M::C を再オープンしようとしていてエラーになっている # error: superclass mismatch for class C (TypeError) class C < String # (1) end
- これは
include M
するとC
を参照する時にM::C
を参照するようになっているからぽい
module M class C end end include M # これは明示的に親スコープがない C を参照するので false p Object.const_defined?(:C, false) # これは C を探索しようとして M::C を見つけるのでそれを参照する p C # => M::C # この C も M::C を参照する class C < String # (1) end
- ちなみに以下のようにトップレベル以外だとエラーにはならない
module M class C end end module N include M # これは M::C を参照する pp C # = > M::C # これは N::C を参照する class C < String pp self # => N::C end # これは N::C を参照する pp C # = > N::C end
- 具体的には以下のようなケースで困っているらしい
require "active_record" require "rexml" include REXML class Comment < ActiveRecord::Base # superclass mismatch for class Comment (TypeError) end
- この問題をどう扱うのかは開発者会議で議論されて決定される予定