我知道这是一种糟糕的做法,但我发现了一些东西,我想更多地了解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

Ruby相关问答推荐

当Ruby `Complex` 类除了`==` 之外没有任何关系运算符时,它的祖先怎么能有`Comparable`?

Ruby符号前面的-是什么意思?

确保 Capybara 不存在元素

Ruby $:.unshift File.dirname(__FILE__)

如何增加 ruby​​ 应用程序的堆栈大小.递归应用程序获取:堆栈级别太深(SystemStackError)

在 Ruby 中导出环境变量

用于 ruby​​ gems 的新 10.9 OSX 的命令行工具?

Ruby 中的 STDIN 和 $stdin 有什么区别?

无法在 Heroku 教程中使用 Python 启动工头

Ruby 中的字符串是可变的吗?

将ruby数组转换为连续对数组

Ruby数组中的`return`#map

无法从同一网络上的另一台计算机访问本地 Sinatra 服务器

将 Ruby 哈希转换为 YAML

动态设置 Ruby 对象的属性

Ruby 中的文件打开模式

为什么 Ruby 没有真正的 StringBuffer 或 StringIO?

Ruby 在特定目录中运行 shell 命令

将整个文本文件作为单个字符串读取的合理方法是什么?

Ruby:define_method 与 def