2011-04-23 50 views
3

我已将一组.rb文件放在目录modules/中。每个文件都包含一个模块。我与这个加载所有这些文件从一个独立的脚本:在Ruby 1.9.2的目录中包含所有模块

Dir["modules/*.rb"].each {|file| load file } 

但我必须包括他们,一个接一个,列出并明确命名它们:

class Foo 
    include ModuleA 
    include ModuleB 
    # ... and so on. 
end 

我“M想知道是否有一些非显性的一行能做到这一点,一拉(伪)...

class Foo 
    for each loaded file 
    include the module(s) within that file 
    end 
    # ... other stuff. 
end 

我已经考虑实际读取文件的内容,搜索字符串”module“,然后提取模块名称,并在某种程度上基于这个做出include--但这看起来很荒谬。

是我想要做的建议和/或可能吗?

回答

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 
0

我希望这是可能的,因为你可以把ruby代码下面的类和包括也只是一个红宝石调用,但你必须考虑哪些模块需要包括在哪里,因为你的代码不是唯一一个加载和包含模块。而且你不想在你的课堂中包含对象空间中的所有模块。

因此,我个人会将它们包括在名称中 - 您正在为一个类添加funcionality,并通过命名每个模块来记录正在添加的地方。

如果你想要这一行:在每个模块中添加一个代码,将其名称添加到全局列表中(记住全部使用全局列表的缺点),然后在类定义中迭代此列表以包含所有这些列表或部分基于像名称或什么样的标准。