ruby如何在内部调用任何方法?

ruby如何在内部调用任何方法?,ruby,oop,private,Ruby,Oop,Private,在下面的程序中,子类的方法调用父类的私有方法 class Parent private def new_name 'Private Method' end end class Child < Parent def get_parent_name puts new_name end end obj = Child.new obj.get_parent_name 访问父类的私有方法。在内部,它如何调用该方法?作为一种面向对象的编程语言

在下面的程序中,子类的方法调用父类的私有方法

class Parent  
  private
    def new_name
      'Private Method'
    end
end


class Child < Parent
  def get_parent_name
    puts new_name
  end
end

obj = Child.new
obj.get_parent_name

访问父类的私有方法。在内部,它如何调用该方法?作为一种面向对象的编程语言,它应该使用对象来调用它。但是对象不能访问私有方法。

Ruby中的私有方法是继承的。所以,若您为父对象定义私有方法,它也会出现在子对象中

回答您对第一个答案的评论

类中存在对当前实例的隐式引用。当您将新名称放入get_parent_name中时,您真正要做的是在当前实例上调用新名称

实际上,当你说private时,Ruby所做的就是避免使用显式对象引用调用方法

class Klass  
  private

  def new_name
    'Private Method'
  end

  def new_name_pub__wrong
      self.new_name  # won't work since using an explicit object reference
  end

  def new_name_pub__ok
      new_name  # will work but means basically the same as self.new_name
  end
end
那么在您的情况下,这只是基本的OOP


正如我上面所说的,在实例上的子类调用new_name,发现无它将爬网继承层次结构并找到父类new_name私有方法在Ruby中所有子类都可见,您可以使接收方隐式,在这种情况下,它暗示为self。这类似于Self、Java、C、Scala和许多其他面向对象语言,不同于Smalltalk,它总是需要一个显式接收器


此外,您似乎完全理解从内核继承的私有puts方法是如何被调用的,但是puts和new_name之间没有区别,所以为什么您在使用其中一个方法而不是另一个方法时遇到问题呢?

Ruby使用send来调用该方法。您可以自己完成并访问任何私有方法:

puts obj.send(:new_name)

是的,我知道。但如果ruby是一种面向对象的语言,那么在内部,它应该像self一样使用对象来调用它。那么它在内部使用了什么呢?@user3702690:隐式接收方始终是self。但是使用self时,该方法是不可访问的私有方法。@user3702690:是的,私有方法不能用显式接收方调用。什么是基于OOPS的语言?面向对象编程语言S是什么。。。。。。。。。。。基于面向对象编程语言的语言不是一个奇怪的短语吗?是的,很抱歉这个错误。我已经纠正了。那么你是说一个内隐接受者是不同的,同一范围内的自我是不同的?
puts obj.send(:new_name)