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