Включение всех модулей в каталог в Ruby 1.9.2 - PullRequest
3 голосов
/ 23 апреля 2011

Я поместил набор .rb файлов в каталог modules/.Каждый из этих файлов содержит модуль.Я загружаю все эти файлы из отдельного скрипта следующим образом:

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

Но затем я должен включить их один за другим, перечисляя и называя каждый из них в явном виде:

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

Мне интересно, есть ли какая-то неявная однострочная строка, которая может это сделать, а-ля (псевдокод) ...

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

Я действительно рассматривал чтение содержимого файлов,искать строку "module", а затем извлекать имя модуля и каким-то образом делать include на основе этого - но это кажется нелепым.

Это то, что я пытаюсь сделать, рекомендуется и/ или возможно?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2011

Вы можете вручную определить некоторую переменную в каждом из ваших файлов, а затем проверить ее значение при включении файла.

Например, 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 голосов
/ 23 апреля 2011

Я ожидаю, что это будет возможно, так как вы можете поместить код ruby ​​ниже класса, и include также является просто вызовом ruby, но вы должны подумать о том, какой модуль нужно включить, поскольку ваш код не единственный, который загружает ивключает в себя модули.И вы не захотите включать все модули из объектного пространства в ваш класс.

Так что я лично включил бы их по имени - вы добавляете функциональность в класс и, называя каждый модуль, документируете то, что добавляетсягде.

И если вам нужен этот один вкладыш: поместите код в каждый модуль, который добавляет его имя в глобальный список (с учетом недостатков, если вообще используется глобальные переменные), а затем повторите этот список в определении класса, чтобы включитьвсе они или часть на основе критерия, как имя или что.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...