instance_eval,define_method和method_missing

avy*_*avy 2 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" }
Run Code Online (Sandbox Code Playgroud)

但是不起作用

SystemStackError: stack level too deep
Run Code Online (Sandbox Code Playgroud)

为什么?

mb1*_*b14 6

没有为A 的实例定义define_method ,所以当你再次调用cal.sefine_method时,会再次调用= 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
Run Code Online (Sandbox Code Playgroud)