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)