2011-09-19 22 views
2

guys。我创建了一个类:instance_eval,define_method和method_missing

class A 
    def initialize &b 
    instance_eval &b 
    end 

    def method_missing method_id, *args 
    self.define_method(method_id) { puts args.first } 
    end 
end 

b = A.new { new_method "oops" } 

但就是不起作用

SystemStackError: stack level too deep 

为什么?

+0

你可以在method_missing的添加跟踪或断点揣摩自己的问题是什么... – mb14

+0

当添加一些日志语句代码,你会看到define_method没有为实例定义,因此递归。在调用define_method之前为#{method_id}“开始添加'p'Begin method_missing时,您将记录很多行:'Begin method_missing for define_method' – mliebelt

+0

Thanks guys,all works! – avy

回答

6

define_method没有为A的实例定义,所以当你调用self.define_method时再次cal method_missing,再次出现=>堆栈溢出。

你需要做这样的事情,而不是

class A 
    def initialize &b 
     instance_eval &b 
    end 

    def method_missing(method_id, *args) 
     self.class.instance_eval do 
     define_method(method_id) { debugger; puts args.first } 
     end 
    end 
    end 
+0

感谢您的回答! – avy

+0

你可以看看[this](http://stackoverflow.com/questions/900419/how-to-understand-the-difference-between-class-eval-and-instance-eval) – mb14

+0

@avy它可能将这些方法作为单例方法添加更安全(例如它是线程安全的)。你真的需要为每个实例添加的方法吗? – Kelvin