ruby-on-rails - 类加载后的Ruby包含链模块
问题描述
我有一种情况,我必须在加载类之后加载我的模块。下面是示例代码
require 'active_support/concern'
module A
extend ActiveSupport::Concern
def method_a
puts "Method_a"
end
end
module B
extend ActiveSupport::Concern
def method_b
puts "Method_b"
end
end
class Ab
include B
def calltest
method_a
method_b
end
end
B.send(:include, A)
Ab.new.method_a
Ab.new.method_b
当我调用上面的示例时method_a
,它会引发错误。但是,如果将那条线移到Ab
类上方,它就可以正常工作。我不想A
在 class 中包含模块Ab
。有人可以在不更改代码顺序的情况下帮我打电话吗?
解决方案
为什么你包括A
into B
,而不是 into Ab
?这会起作用:
# B.send(:include, A)
Ab.include A
您的代码不起作用,因为include B
已执行并且基本上所有方法都已B
添加到基础中。可以实现self.included
回调B
,收集它包含的所有类/模块,并在其特征类上调用时更新所有这些类/模块include
,但这看起来像是一种奇怪的矫枉过正。
旁注: Module#include
是公开的。
推荐阅读
- css - 如何使用 Angular 8 更改 Bulma.io 变量的值
- ssl - 路径在 Kubernetes NGINX 入口控制器中不起作用
- lazarus - 单击 Lazarus 中的按钮编辑文件
- c - 如何打印字符 *
- azure - 我的域的 DNS 记录没有通过 dns-01 挑战在 azure-dns 上传播
- javascript - 如何在Angular组件中使用`this`重新分配对象?
- flask - Flask 应用程序上下文错误未通过“with”子句解决
- android - Firebase FCM 通知图片不会显示
- fortran - 互操作性:Fortran 到 C++
- python - 为什么此输出列表在此代码中不起作用?