我在Rails控制台中运行reload!
时收到“类的超类不匹配”错误。我在ruby中定义了一些超级简单的类,如下所示:
# base_class.rb
module A
module B
module C
class BaseClass
def close
#stub
end
end
end
end
end
和:
# more_specific.rb
module A
module B
module C
class MoreSpecific < BaseClass
def initialize
# ...
end
def close
end
end
end
end
end
我可以看到实际上存在问题,因为如果在执行reload!
之前先执行此操作,
A::B::C::MoreSpecific.superclass.equal? A::B::C::BaseClass
我得到true
,然后在收到错误后执行此操作,则得到false
。另外,object_id
的BaseClass
实际上确实发生了变化。
为什么会发生这种情况?我检查了代码库中对MoreSpecific
类的其他引用,因为我认为这可能会导致将BaseClass作为一个常量多次建立,但没有看到任何东西。
什么导致A:B:C::BaseClass
的object_id在reload!
之后切换?
reload!
是Rails控制台方法,不是标准的Ruby方法。尽管可能还会有其他原因导致您看到该行为,但值得注意的是,more_specific.rb中的C模块在运行时没有require base_class
,并且可能会丢失其查找;如果没有它,Rails可能无法按您期望的方式autoload进行模块化。
请确保依赖BaseClass的模块包含要重新加载模块时要执行的require base_class
语句。如果仍不能解决问题,则您的代码中可能还会存在其他问题,这些问题未在您当前的帖子中显示。