在ruby语言中,Kernel模块的print是私有的,为什么可以随处调用?

败给你了 发布于 2014/10/10 00:01
阅读 140
收藏 0

《ruby元编程》,在ruby语言,可以在任何代码位置中调用print(),而print()是Kernel模块的私有方法:Kernel.private_instance_methods.grep(/^pr/)#=>[:printf,:print,:proc].而Object类包含了Kernel模块,因此Kernel就进入了每个对象的祖先链中。这样就可以在某个对象中随意调用Kernel模块的方法了。这使得print看起来像是一个语言的关键字。

我想问的是:既然是Kernel的private方法,为什么可以各种位置调用呢?

关于模块的private方法无法被调用:

module HelloWorld
  private
  def sayHello
    puts "super::sayHello"
  end
end

class Parent
  include HelloWorld
end
class Child < Parent

end

print HelloWorld.private_instance_methods #=>[:sayHello]

#调用
Child.new.sayHello  #=>private method `sayHello' called for #<Child:0x1683c30> (NoMethodError)

加载中
0
fxhover
fxhover
纠正一下,print是Kernel的public方法,通过Kernel.public_methods.select {|m| m =~ /print/}可以查看。任何地方都可以调用print方法是因为这些对象都是Object的实例,Object中include Kernel,因此都可以调用Kernel的print方法。
败给你了
败给你了
回复 @fxhover : 谢谢你的耐心解答啊。我被Object,Kernel,Module,Class等几个对象的循环关系弄晕了。
fxhover
fxhover
回复 @败给你了 : 类.public_methods返回的是类的类方法,类.private_instance_methods等价于 类对象.private_methods,获取的是私有实例方法。
fxhover
fxhover
回复 @败给你了 : Kernel有两个print方法,一个是Kernel的类方法,一个是私有的实例方法,Object中include Kernel,因此Object的实例都可以使用print方法。
败给你了
败给你了
谢谢你的解答,但为什么Kernel的private_instance_methods返回的方法也有[:print,:printf...]呢?private_instance_methods和public_methods有什么区别啊?
返回顶部
顶部