【发布时间】:2020-04-14 23:36:57
【问题描述】:
当我在 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。此外,BaseClass 的object_id 实际上确实发生了变化。
为什么会发生这种情况?我已经检查了代码库中对 MoreSpecific 类的其他引用,因为我认为这可能会导致 BaseClass 被多次建立为常量,但没有看到任何内容。
什么可能导致A:B:C::BaseClass 的object_id 在reload! 之后切换?
【问题讨论】:
-
请注意,您使用的是 Rails,而不是纯 Ruby,而且这个问题是关于 Rails 控制台中的 Rails 自动加载行为。
标签: ruby ruby-on-rails-4 inheritance autoload superclass