Метод Ruby Static с локальной областью действия - PullRequest
1 голос
/ 26 августа 2011

Название звучит смешно, потому что это так. Моя самая большая проблема - попытаться выяснить, какой вопрос задать.

  1. Цель: иметь возможность реализовать код, как описано ниже, ИЛИ выяснить, какую терминологию я должен использовать для поиска правильного ответа.

  2. Проблема: я хочу иметь систему, в которой классы регистрируют "процессоры" через метод в определении класса. например:

    class RunTheseMethodsWhenICallProcess
      Include ProcessRunner
    
      add_processor :a_method_to_run
      add_processor :another_method_to_run
    
      def a_method_to_run
        puts "This method ran"
      end
    
      def another_method_to_run
        puts "another method ran"
      end
    
    end
    
    Module ProcessRunner
      def process
         processors.each {|meth| self.send(meth)}
      end
    end
    

Мои проблемы, в основном, связаны с пониманием объема и ссылок на класс, чтобы заставить их взаимодействовать. В существующем состоянии я смог добавить статический метод add_processor, вызвав class.extend (AClass) во включенном методе и добавив туда класс.

Идея этого синтаксиса была основана на методах DataMappers 'property' и 'before'. Даже после проверки кода у меня возникают проблемы с его следованием.

Большое спасибо за любую помощь, которую вы можете предложить.

1 Ответ

1 голос
/ 26 августа 2011

Если я вас правильно понял, следующее будет делать то, что вы хотите.

Инициализирует каждый класс (или модуль), включая ProcessRunner, пустой массив в @@processors. Кроме того, он добавляет методы класса processors (простой метод получения) и add_processor. Метод process должен быть скорректирован для использования метода класса. На самом деле, вы могли бы добавить обертку для этого, но я думаю, что это было бы многословно для такого образца.

module ProcessRunner

  module ClassMethods
    def add_processor(processor)
      processors << processor
    end

    def processors
      class_variable_get :@@processors
    end
  end

  def self.included(mod)
    mod.send :class_variable_set, :@@processors, []

    mod.extend ClassMethods
  end

  def process
    self.class.processors.each {|meth| self.send(meth)}
  end

end

class RunTheseMethodsWhenICallProcess
  include ProcessRunner

  add_processor :a_method_to_run
  add_processor :another_method_to_run

  def a_method_to_run
    puts "This method ran"
  end

  def another_method_to_run
    puts "another method ran"
  end

end
...