假设我有多个继承自公共父级的子类。
我想使用define_method
以编程方式为每个子节点定义一些方法。但是,为每个孩子定义的方法列表是不同的。
所以我实现了以下内容 -
class Parent
def define_some_methods!
self.class::MY_METHODS.each do |m|
proc = Proc.new { "You called method #{m}" }
self.class.send(:define_method, m, &proc)
end
end
end
class ChildOne < Parent
MY_METHODS = [:foo, :bar]
def initialize
define_some_methods!
end
end
class ChildTwo < Parent
MY_METHODS = [:alpha, :bravo]
def initialize
define_some_methods!
end
end
ChildOne.new.foo #=> "You called method foo"
ChildTwo.new.alpha #=> "You called method alpha"
这很好用,但每次实例化一个新类时都会调用define_some_methods
。这种方法在课堂上不断重新定义相同的方法。
在定义初始类时,有没有办法一次?
我试过像 -
这样的东西class ChildTwo < Parent
MY_METHODS = [:alpha, :bravo]
define_some_methods!
end
但是错误
NoMethodError: undefined method `define_some_methods!' for ChildTwo:Class
Did you mean? define_method
答案 0 :(得分:0)
您确定在这种情况下需要元编程吗?你能在Parent中定义一个方法名称的额外参数吗?
如果Parent可以是一个模块,那么我们可以这样解决:
module Parent
def self.module(*methods)
Module.new do |_mod|
methods.each do |method|
define_method(method) { "You called method #{method}" }
end
end
end
end
class ChildOne
include Parent.module(:foo, :bar)
end
class ChildTwo
include Parent.module(:alpha, :bravo)
end
答案 1 :(得分:0)
您已为父级定义了一个实例方法,但您需要一个类方法,如下所示:
class Parent
def self.define_some_methods!
self::MY_METHODS.each do |m|
proc = Proc.new { "You called method #{m}" }
send(:define_method, m, &proc)
end
end
end