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

rogerluo410 · 2015年03月30日 · 最后由 lyfi2003 回复于 2015年03月31日 · 2116 次阅读

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

请看一下这个例子:

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,用这个就没法调用私有方法了。

楼上正解~

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