在初始化中从块内调用super

时间:2016-03-10 14:03:43

标签: ruby

我需要使用块定义初始值设定项,如下面的代码所示:

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在这些区块中按预期工作?

0 个答案:

没有答案