我经常读到Ruby是一种纯粹的面向对象语言,因为命令通常作为传递给对象的消息给出.
例如:
在Ruby中,我写道: "A".ord
获取ascii代码A
并 0x41.chr
在给定ascii代码的情况下发出字符.这与Python的相反: ord("A")
和chr(0x41)
到目前为止一直很好--- Ruby的语法是消息传递.
但是在考虑字符串输出命令时会出现明显的不一致:
现在有一个:puts str
或者puts(str)
代替str.puts
鉴于Ruby语法的纯对象期望,我希望输出命令是传递给字符串对象的消息,即从字符串类调用方法,因此 str.puts
有什么解释吗?我错过了什么吗?
谢谢
我原以为输出命令是传递给字符串对象的消息,即从字符串类调用方法,因此str.puts
这是不正确的期望,让我们从那开始吧.你为什么要把字符串告诉puts
自己?它会打印出什么?它对文件,I/O流,套接字和其他可以打印的地方一无所知(也应该不知道).
当你说puts str
,它实际上被视为self.puts str
(隐式接收器).也就是说,消息被发送到当前对象.
现在,所有对象都包含Kernel
模块.因此,所有对象都在其方法列表中具有Kernel#puts.任何对象都可以puts
(包括当前对象self
).
正如医生所说,
puts str
被翻译成
$stdout.puts str
也就是说,默认情况下,实现被委托给标准输出(打印到控制台).如果要打印到文件或套接字,则必须puts
在文件或套接字类的实例上调用.这完全是OO.
Ruby并不完全是 OO(例如,方法不是对象),但在这种情况下,它是.puts
是Kernel#puts
,这是简写$stdout.puts
.也就是说,您正在调用流的puts
方法$stdout
并将字符串作为要输出到流的参数传递.所以,当你打电话的时候
puts "foo"
你真打电话:
$stdout.puts("foo")
这与OO完全一致.