我在目录.rb
中放置了一组modules/
个文件。每个文件都包含一个模块。我正在使用以下单独的脚本加载所有这些文件:
Dir["modules/*.rb"].each {|file| load file }
但是我必须逐个列出它们,并明确地列出并命名每一个:
class Foo
include ModuleA
include ModuleB
# ... and so on.
end
我想知道是否有一些可以实现此目的的非显式单行程,la(伪代码)......
class Foo
for each loaded file
include the module(s) within that file
end
# ... other stuff.
end
我考虑过实际读取文件的内容,搜索字符串“module
”,然后提取模块名称,并以某种方式基于此做include
- 但似乎可笑了。
我正在尝试做什么是可取的和/或可能的?
答案 0 :(得分:2)
您可以在每个文件中手动定义一些变量,然后在包含文件时检查其值。
例如,module1.rb
:
export = ["MyModule"]
module MyModule
end
第二个,module2.rb
:
export = ["AnotherModule", "ThirdModule"]
module AnotherModule
end
module ThirdModule
end
然后将所有这些内容都包含在您的文件中(只是想法,它可能无法正常工作):
class Foo
Dir["modules/*.rb"].each do |file|
load file
if export != nil
export.each do { |m| include(Kernel.const_get(m))
end
end
end
答案 1 :(得分:0)
我希望它是可能的,因为你可以将ruby代码放在class下面,include也只是一个ruby调用但是你必须考虑哪个模块需要包含在哪里,因为你的代码不是唯一加载的代码包括模块。而且您不希望在课堂中包含对象空间中的所有模块。
所以我个人会按名称包含它们 - 你正在为一个类添加功能,并通过命名每个模块来记录在哪里添加的内容。
如果你想要这个衬里:在每个模块中放一个代码,将其名称添加到全局列表中(记住使用全局变量时的缺点)然后在类定义中迭代此列表以包含所有这些或部分基于类似名称或什么的标准。