我经常读到 Ruby 是一种纯面向对象的语言,因为命令通常作为传递给对象的消息给出。
例如:
在 Ruby 中,编写:"A".ord
获取 A
的 ascii 代码和 0x41.chr
以发出给定的字符它的ascii码。
这与 Python 的:ord("A")
和 chr(0x41)
到目前为止一切顺利 --- Ruby 的语法是消息传递。
但在考虑字符串输出命令时出现了明显的不一致:
现在有:puts str
或 puts(str)
而不是 str.puts
鉴于对 Ruby 语法的纯面向对象期望,我希望输出命令是传递给字符串对象的消息,即从字符串类调用方法,因此 str.puts
有什么解释吗?我错过了什么吗?
谢谢
最佳答案
I would have expected the output command to be a message passed to the string object, i.e. calling a method from the string class, hence str.puts
这是不正确的期望,让我们从那个开始。为什么要告诉字符串 puts
本身?它会将自己打印成什么?它对文件、I/O 流、套接字和其他可以打印东西的地方一无所知(而且应该一无所知)。
当你说 puts str
时,它实际上被视为 self.puts str
(隐式接收器)。即向当前对象发送消息。
现在,所有对象都包含Kernel
模块。因此,所有对象都有Kernel#puts在他们的方法列表中。任何对象都可以puts
(包括当前对象,self
)。
正如文档所说,
puts str
翻译成
$stdout.puts str
也就是说,默认情况下,实现委托(delegate)给标准输出(打印到控制台)。如果要打印到文件或套接字,则必须在文件或套接字类的实例上调用 puts
。这完全是面向对象的。
关于作为 "pure"面向对象语言的 Ruby --- 与 Ruby puts 不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21522266/