gpt4 book ai didi

作为 "pure"面向对象语言的 Ruby --- 与 Ruby puts 不一致?

转载 作者:数据小太阳 更新时间:2023-10-29 08:14:55 24 4
gpt4 key购买 nike

我经常读到 Ruby 是一种纯面向对象的语言,因为命令通常作为传递给对象的消息给出。

例如:

在 Ruby 中,编写:"A".ord 获取 A 的 ascii 代码和 0x41.chr 以发出给定的字符它的ascii码。这与 Python 的:ord("A")chr(0x41)

形成对比

到目前为止一切顺利 --- Ruby 的语法是消息传递。

但在考虑字符串输出命令时出现了明显的不一致:

现在有:puts strputs(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com