Как вы перегружаете динамически расширенные методы в ruby? - PullRequest
2 голосов
/ 06 февраля 2010

У меня есть несколько модулей в массиве. Все модули определяют метод, называемый «процесс», и я хотел бы вызывать каждый из этих методов процесса по очереди. Код, который у меня есть, выглядит примерно так (предположим, что все модули определены внутри класса Mod):

modules.each do |mod|
  extend Mod.const_get(mod)
  process(data)
end

Это нормально работает в первый раз, но метод не перезаписывается после первого прохода цикла. Я попытался добавить undef process в качестве последней строки внутри блока each, но это не сработало.

Есть ли способ, которым я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2010

модули могут быть включены в цепочку наследования только один раз.

Кроме того, то, что вы делаете, действительно странно, вы должны подумать о перепроектировании вашей системы.

2 голосов
/ 06 февраля 2010

превращает метод 'process' в метод-модуль как опцию (определяя его как def self.process)?

Если это так, отправка метода 'process' непосредственно в возвращаемую константу будет работать:

modules.each do |mod|
  Mod.const_get(mod).send(:process, data)
end

EDIT Если подумать, почему бы не вызвать метод напрямую?

  Mod.const_get(mod).process(data)
...