Ruby 一个关于 Module#define_method () 方法的一点疑惑

rogerluo410 · March 30, 2015 · Last by lyfi2003 replied at March 31, 2015 · 2201 hits

有一点疑惑,不知道有谁可以帮我解答。

请看一下这个例子:

class B

B.class_eval do
   Object.send :define_method, :n do   #此处,为什么Object可以调用 define_method?
     p "define_method..."
  end
end

B.n  #=> define_method...

p Module.private_instance_methods.grep /^define_method/  #=> [:define_method]
p Object.private_instance_methods.grep /^define_method/
p Kernel.private_instance_methods.grep /^define_method/

define_method 是 Module 中的一个私有方法,Object 是 Module 的一个超类,根据 ruby 的 ancestor 链,方法是从下往上查找, 1.为什么 Object 类可以使用它下层类的方法?? 2.还有一个问题是,define_method 是 Module 中的一个私有方法,那么下层继承的类是怎么可以使用这个私有方法的?

你这样理解有问题。

Object.send 是指找 Object.class 里面的 instance_methods. 所以可以使用 define_method 不足为奇。因为 Class 本身是有这个实例方法的。

#1 楼 @lyfi2003 谢谢,我还有个问题,define_method 是私有方法,那么子类是怎么可以调用这个方法呢?

直接调用私有方法是不行的,但用 send 就可以。

#3 楼 @rogerluo410 因为用的是 send 方法,它可以调用包括 private method 在内的方法,2.0 之后加了个 public_send,用这个就没法调用私有方法了。

楼上正解~

You need to Sign in before reply, if you don't have an account, please Sign up first.