我需要使用块定义初始值设定项,如下面的代码所示:
module Base
def add_init(&block)
@init = block
define_method(:initialize) { |*args| self.class.lookup(self, *args) }
end
def lookup(obj, *args)
obj.instance_exec(*args, &@init)
end
end
class Foo
extend Base
add_init { |s| puts "Init Foo with '#{s}'" }
end
class Bar < Foo
extend Base
add_init { |s| super(s); puts "Init Bar with '#{s}'" }
end
只是define_method(:initializer) {}
不会这样做,因为我后来需要在查找方法上添加几个块和一个机制来选择要调用的方法。
现在的问题如下:
Foo.new('test')
# Init Foo with 'test'
Bar.new('test')
# TypeError: self has wrong type to call super in this context: Bar (expected #<Class:#<Object:0x007f84590de460>>)
如何让super
在这些区块中按预期工作?