开发者

Including all modules in a directory in Ruby 1.9.2

I've placed a set of .rb files in a directory modules/. Each of these files contains a module. I'm loading开发者_JAVA百科 all of these files from a separate script with this:

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

But then I have to include them, one by one, listing and naming each of them explicitly:

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

I'm wondering if there is some non-explicit one-liner that can accomplish this, a la (pseudocode) ...

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

I've considered actually reading the files' contents, searching for the string "module", and then extracting the module name, and somehow doing the include based on that -- but that seems ridiculous.

Is what I'm trying to do advisable and/or possible?


You can manually define some variable in each of your file and then check for its value while including the file.

For example, module1.rb:

export = ["MyModule"]

module MyModule

end

And the second one, module2.rb:

export = ["AnotherModule", "ThirdModule"]

module AnotherModule

end

module ThirdModule

end

And then just include all of them in your file (just the idea, it may not work correctly):

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


I would expect it to be possible since you can place ruby code below class and include is also just a ruby call but you have to think of which module needs to be included where since your code is not the only one that loads and includes modules. And you wil not want to include all modules from the object space in your class.

So i personally would include them by name - you are adding funcionality to a class and by naming each module you document what is being added where.

And if you want this one liner: put a code in each module that adds its name to global list (remembering the disadvantages if using globals at all) and then iterate this list in the class definition to include all of them or part based on a criterium like name or what.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜