我正在尝试创建一个动态执行以下操作的方法:(因为我必须在大约30个不同的子类集上实现它)
def t1
FooT1.new
end
def t2
FooT2.new
end
def t3
FooT3.new
end
在方法生成中将有2个变量,选项卡号(t1 ... tx)和类的名称(Foo)
我尝试了以下内容,但我是Ruby的新手,无法实现这一点。
def method_generator(num_tabs, class_name)
1.upto(num_tabs) do |i|
define_method("t#{i}") do
"#{class_name}_t#{i}".new
end
end
end
然后在子类中调用它,如下所示:
method_generator(3, "Bar")
我知道我在实施这个方面可能还很遥远,所以感谢任何帮助。
答案 0 :(得分:0)
请按以下步骤操作:
def method_generator(num_tabs, class_name)
1.upto(num_tabs) do |i|
class_name.send(:define_method,"t#{i}") do
"#{class_name}_t#{i}".new
end
end
end
Module#define_method
是私有方法,因此您无法在class_name
class_name.define_method(:name) do ..end
上调用它,因为私有方法调用不允许使用显式接收器。但是这样做Object#send
会对你有所帮助,因为这种方法适用于这种情况,你不能通过显式接收者调用私有方法。
让我们通过一个例子验证这个技巧是否有效。
class Foo;end
def method_generator(num_tabs, class_name)
1.upto(num_tabs) do |i|
class_name.send(:define_method,"t#{i}") do
"#{class_name}_t#{i}".new
end
end
end
method_generator(3,Foo)
Foo.instance_methods(false)
# => [:t1, :t2, :t3] # see here 3 instance methods has been created of class Foo