ruby - 为什么 Rails 控制台中的“重新加载!”会导致“类的超类不匹配”(Rails 4)
问题描述
reload!
在 Rails 控制台中运行时,出现“类的超类不匹配”错误。我在 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 多次被建立为常量,但没有看到任何内容。
什么可能导致 object_id 在A:B:C::BaseClass
之后切换reload!
?
解决方案
没有 Require 语句的自动加载模块
reload!
是 Rails 控制台方法,而不是标准 Ruby 方法。虽然您看到的行为可能还有其他原因,但值得注意的是more_specific.rb中的 C 模块在运行时不会require base_class
,并且可能会丢失其查找;如果没有它, Rails 可能无法按照您期望的方式自动加载模块。
确保依赖 BaseClass 的模块包含require base_class
在模块重新加载时要执行的语句。如果这不能解决问题,则您的代码可能还有其他问题,这些问题未在您当前的帖子中显示。
推荐阅读
- c++ - CURL ERROR DOWNLOAD : Recv failure : 连接被重置(使用 C++)
- html - React Native HTML - 呈现线性背景渐变
- firebase - 在模拟的 Firebase 函数中运行 admin.storage().bucket(..).file(..).move() 时出现未实现的 API 错误
- kotlin - 测试是否调用嵌套方法调用时,Mockito 测试抛出“想要但未调用”
- javascript - 将 Angularjs、Nodejs 和 D3.js 定义为“技术”是否正确?
- python - Sql Location_of_2nd_Max_Logins 逻辑
- reactjs - React js错误:表单标签必须与控件相关联
- php - 在 WooCommerce 产品搜索中启用按 product_tag 搜索
- html - 如何围绕中心对齐 2 x 2 div?例如,内角应该在父中心
- airflow - 气流 schedule_interval,如何放弃这个计划任务