instance_eval,define_method和method_missing

时间:2011-09-19 12:41:23

标签: ruby

人。我创建了一个类:

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

为什么?

1 个答案:

答案 0 :(得分:6)

未为A的实例定义define_method,因此当您再次调用cal.sefine_method时,再次调用cal方法_的方法,再次=>>堆栈溢出。

你需要做那样的事情

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