具有局部作用域的Ruby静态方法

时间:2011-08-26 04:52:03

标签: ruby methods static module include

标题听起来很荒谬,因为它是。我最大的问题实际上是试图找出要问的问题。

  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
    
  3. 我的问题主要是了解课程的范围和参考,以使他们互动。就目前而言,我已经能够通过在include方法中调用class.extend(AClass)并在那里添加类来添加静态方法'add_processor'。

    这种语法的想法受到了DataMappers的“属性”和“之前”方法的启发。即使签出代码,我也会遇到麻烦。

    非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

如果我找对你,以下将做你想做的事。

它初始化每个类(或模块),包括ProcessRunner,以在@@processors中有一个空数组。此外,它还添加了类方法processors(一个简单的getter)和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