我知道这是一种糟糕的做法,但我发现了一些东西,我想更多地了解Ruby中的方法调用机制.
最近,我创建了一个类,并将一个方法命名为Print.在这print人中,我拨打了标准print人的电话,显然,我有问题.当我发现我有一个名称冲突时,我立刻知道正确的解决方案是将我的print更改为另一个名称,但我的灵魂中产生了一个疑问:如果出于任何原因我真的需要保留名称print,我如何在我的方法print中调用标准的Ruby print?
我知道这是一种糟糕的做法,但我发现了一些东西,我想更多地了解Ruby中的方法调用机制.
最近,我创建了一个类,并将一个方法命名为Print.在这print人中,我拨打了标准print人的电话,显然,我有问题.当我发现我有一个名称冲突时,我立刻知道正确的解决方案是将我的print更改为另一个名称,但我的灵魂中产生了一个疑问:如果出于任何原因我真的需要保留名称print,我如何在我的方法print中调用标准的Ruby print?
当你拨打print
的时候,通常是Kernel.print
.之所以不需要显式添加接收器Kernel
,是因为Object
中包含了Kernel
模块(Ruby中大多数对象的基类).
在您的例子中,您已经在自己的类中定义了一个print
方法,因此,如果您想使用Kernel#print
,您有两个 Select ,您可以:
Kernel.print
(可能是此实现的首选);或super
在层次 struct 链中向上传递(直到它遇到另一个print
方法,通常是Kernel#print
)示例:
class MyObject
def print(val)
Kernel.print "#{val} called with Kernel.print"
puts
super "#{val} print passed up the hierarchy chain"
end
end
o = MyObject.new
o.print('engineersmnky')
# engineersmnky called with Kernel.print
# engineersmnky print passed up the hierarchy chain
#=> nil