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

时间:2014-10-20 11:54:14

标签: 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

Ruby被认为是面向对象的语言所以行

puts new_name

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

4 个答案:

答案 0 :(得分:0)

Ruby中的私有方法是继承的。因此,如果您为Parent定义私有方法,它也会出现在Child中。

答案 1 :(得分:0)

回答你对第一个答案的评论。

对类中的当前实例有隐式引用。在puts new_name内进行get_parent_name时,您正在做的是在当前实例上调用new_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(私有方法对所有子类都可见)

答案 2 :(得分:0)

在Ruby中,您可以隐式接收接收器,在这种情况下隐含为self。这类似于Self,Java,C#,Scala和许多其他面向对象的语言,而不像Smalltalk,它总是需要一个明确的接收器。

此外,您似乎完全没有理解如何调用从puts继承的私有Kernel方法,但putsnew_name之间没有区别那你为什么遇到一个而不是另一个呢?

答案 3 :(得分:0)

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

puts obj.send(:new_name)

Here is the doc