标题听起来很荒谬,因为它是。我最大的问题实际上是试图找出要问的问题。
目标:能够实现如下所述的代码或弄清楚我应该使用什么术语来搜索正确的答案。
问题:我希望有一个系统,其中类通过类定义中的方法注册“处理器”。例如:
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
我的问题主要是了解课程的范围和参考,以使他们互动。就目前而言,我已经能够通过在include方法中调用class.extend(AClass)并在那里添加类来添加静态方法'add_processor'。
这种语法的想法受到了DataMappers的“属性”和“之前”方法的启发。即使签出代码,我也会遇到麻烦。
非常感谢您提供的任何帮助。
答案 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