Ruby One Question about Method Lookup Process

logchi · 2014年01月11日 · 最后由 zgm 回复于 2014年01月11日 · 1911 次阅读

我正在看《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]

这个查找过程是正确的吗?如果不是,应该是怎样的?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号