我正在看《Metaprogramming Ruby》, Chapter3 中 Flattening the Scope 这一小节有这样一段代码:
my_var = "Success"
MyClass = Class.new do
puts "#{my_var} in the class definition!"
define_method :my_method do
puts "#{my_var} in the method!"
end
end
MyClass.new.my_method
在 Class.new 后连接的 Block 中,这里 self 是 Class 对象,这时调用 define_method 方法,我想问的是当 define_method 方法被调用时的查找过程
我目前知道的是,Class 作为一个对象,首先它会寻找自己是否有这个方法
Class.methods false # => []
发现没有之后会跑到自己所属的类中的实例方法里寻找
Class.class # => Class
Class.instance_methods false # => [:allocate, :new, :superclass]
Class.private_instance_methods false # => [:inherited, :initialize]
因为 Class 的类是自己,所以还是没找到,之后就沿着祖先链继续向上寻找
Class.ancestors # => [Class, Module, Object, PP::ObjectMixin, Kernel, BasicObject]
终于在 Module 中找到了 define_method 这个实例方法
Module.private_instance_methods(false).grep /define_method/ # => [:define_method]
这个查找过程是正确的吗?如果不是,应该是怎样的?