的`我有这样的代码:行为super`
class B
def self.definer(name, *args, &block)
define_method(name) { self.instance_exec(*args, &block) }
end
end
,当我尝试使用它,我得到这个错误:
B.definer(:tst) { super }
# => :tst
B.new.tst
# => TypeError: self has wrong type to call super in this context: B (expected #<Class:#<Object:0x007fd3008123f8>>)
我明白super
具有特殊的意义,与调用方法有点不同。有人可以解释为什么以及发生了什么?如果有人为此提出解决方案,这也会很棒。
我想定义方法我自己的方式,我的意思是做同样的define_method,但做一些额外的工作之前实际的方法定义和方法体调用之前。 关于'super'必须在方法定义中使用,实际上并不是真的,'define_method'就是一个例子,你可以在它的block中使用'super',它可以正常工作。 可能是正确的问题,我将如何在纯ruby中实现'define_method',没有c代码,或者它甚至可能实现? – cvb
我认为问题是在一个'instance_exec'中调用super,它改变'self'和执行的上下文,使得'super'的方法丢失。在这种情况下'自我有错误的类型调用super'。我认为在传给instance_exec的块中可能没有办法调用super。 – jrochkind
yes好像是在方法定义之外调用'super'的唯一方法就是将块转换为像ruby内部的'rb_add_method'这样的方法 – cvb