2015-10-16 20 views
0

的`我有这样的代码:行为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具有特殊的意义,与调用方法有点不同。有人可以解释为什么以及发生了什么?如果有人为此提出解决方案,这也会很棒。

回答

0

我没有收到与您一样的错误消息,但仍然收到错误消息。必须在方法定义中使用super。但是你没有在方法定义中使用它。这提出了一个错误。

关于解决方案,我不能给你一个,因为它根本不清楚你想做什么。

+0

我想定义方法我自己的方式,我的意思是做同样的define_method,但做一些额外的工作之前实际的方法定义和方法体调用之前。 关于'super'必须在方法定义中使用,实际上并不是真的,'define_method'就是一个例子,你可以在它的block中使用'super',它可以正常工作。 可能是正确的问题,我将如何在纯ruby中实现'define_method',没有c代码,或者它甚至可能实现? – cvb

+0

我认为问题是在一个'instance_exec'中调用super,它改变'self'和执行的上下文,使得'super'的方法丢失。在这种情况下'自我有错误的类型调用super'。我认为在传给instance_exec的块中可能没有办法调用super。 – jrochkind

+0

yes好像是在方法定义之外调用'super'的唯一方法就是将块转换为像ruby内部的'rb_add_method'这样的方法 – cvb

0

你绝对不希望instance_exec那里。

如果你没有足够的* ARGS参与,我说你只是想这样:

def self.definer(name, &block) 
    define_method(name, &block) 
end 

但随后新definer方法将做define_method确实摆在首位的同样的事情,所以没有理由创建它,而不是首先使用define_method

你究竟在做什么?解释你想做什么,也许有人可以帮助你。

但我认为在现有的实施instance_exec是不是你想要的 - 叫define_method当它立刻在definer调用,执行块 - 我想你想运行的程序段时,您所定义的方法被调用呢?但我不确定,这取决于你想做什么,哪一个不清楚。 superinstance_exec - 超到内没有任何意义,你认为你会打电话给什么方法?

+0

这里的例子减少了,实际的用法可以在这里找到https:// github。 COM/jdantonio /官能红宝石/斑点/主/ LIB /功能/ pattern_matching.rb#L134。关于'super'应该调用什么方法,我认为是当前方法,它被执行,我的意思是当你将块发送给'define_method'超级工作时,ruby有一些方法来指定块执行的上下文,所以我想要是完全相同的,在某种方法的上下文中评估我的代码。 – cvb