【发布时间】:2026-01-26 21:55:01
【问题描述】:
在深入探讨之前,我将尝试解释我的代码库的结构。 这个问题与 cmets 中的链接问题不同,因为它涉及模块类中包含的模块列表。不直接在类或 1 级模块中
1) 可能有一个 X 类,其定义如下:
module ParentModule
class X
end
end
2) 不同模块下也可能有嵌套类:
module ParentModule
module ChildModule
class Y
end
end
end
3) 也可能只有一个模块,里面有一些类:
module ParentModule
module OtherModule
def some_awesome_method
..does something
end
end
end
我试图在我的ParentModule 中获取包含OtherModule 的类列表。这是我到目前为止所拥有的,运行良好:
include_resources = ->(klass) {
begin
klass_string = klass.to_s
klass_resource = klass_string.constantize
klass_string if klass_resource.included_modules.include?(OtherModule)
rescue NameError # skip all bad naming and other irrelevant constant loading mishaps
next
end
}
所以如果我执行ParentModule.constants.find_all(&include_resources),我会得到包含OtherModule 的类列表,太好了!但不幸的是,它无法找到嵌套在子模块下的类,如 #2 示例所示。所以我尝试这样做:
include_resources = ->(klass) {
begin
klass_string = klass.to_s
klass_resource = klass_string.constantize
if klass_resource.class == Module
return "ParentModule::#{klass_string}".constants.find_all do |module_klass|
module_klass.constantize.included_modules.include?(OtherModule)
end
end
klass_string if klass_resource.included_modules.include?(OtherModule)
rescue NameError # skip all bad naming and other irrelevant constant loading mishaps
next
end
}
不幸的是,这会返回相同的列表。
【问题讨论】:
-
嗨@maxpleaner 感谢您的输入,但您似乎没有阅读该问题。这个问题不同,因为我有子模块,而链接的问题没有。我从字面上添加了我的代码中的案例,我尝试了什么,什么有效,什么无效。如果这不是您在 SO 上提出问题的方式,我不知道是什么。
-
没有难过的感觉,我只是想帮忙。如果不是相同的问题,您可以拒绝“可能重复”标志。你可以在你的问题中说“我试过
但它没有用,因为 ” -
@Mongoid 你能控制
OtherModule吗?您多久会查询一次它的包含情况?您是否考虑过Module#included,它可以让模块本身跟踪它的位置?显然更多的内存但检索的开销更少。 (除非您打算对许多模块任意执行此操作,在这种情况下答案绝对合适) -
嗨@engineersmnky 是的,我确实可以控制
OtherModule。我会经常查询它。这实际上不是一个坏主意。谢谢,我会试一试
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4