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

标签 ruby string oop syntax

我经常读到 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/

相关文章:

ruby - 是否有 Hash.Merge 的 ActiveRecord 版本?

java - EditText 密码切换按钮不显示密码

python - 如何查找列表 B 中有多少项形成列表 A

model-view-controller - 四种设计模式如何融入 MVC 范式?

iphone - 将装饰器添加到从 NSManagedObject 派生的类中

ruby-on-rails - Ruby 从数组中随机选择有时会重复返回相同的值

html - 不规则的 Bootstrap 列换行

sql - 如何将雪花中单词的第一个字母大写?

ios - 让一个 View Controller 听另一个

ruby-on-rails - 显示与所选产品所在类别相同的随机产品图像。ROR 应用程序