Ruby作为一种"纯粹的"面向对象的语言---与Ruby的不一致?

Ass*_*him 2 ruby oop string syntax

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

例如:

在Ruby中,我写道: "A".ord获取ascii代码A0x41.chr 在给定ascii代码的情况下发出字符.这与Python的相反: ord("A")chr(0x41)

到目前为止一直很好--- Ruby的语法是消息传递.

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

现在有一个:puts str或者puts(str)代替str.puts

鉴于Ruby语法的纯对象期望,我希望输出命令是传递给字符串对象的消息,即从字符串类调用方法,因此 str.puts

有什么解释吗?我错过了什么吗?

谢谢

Ser*_*sev 8

我原以为输出命令是传递给字符串对象的消息,即从字符串类调用方法,因此str.puts

这是不正确的期望,让我们从那开始吧.你为什么要把字符串告诉puts自己?它会打印出什么?它对文件,I/O流,套接字和其他可以打印的地方一无所知(也应该不知道).

当你说puts str,它实际上被视为self.puts str(隐式接收器).也就是说,消息被发送到当前对象.

现在,所有对象都包含Kernel模块.因此,所有对象都在其方法列表中具有Kernel#puts.任何对象都可以puts(包括当前对象self).

正如医生所说,

puts str
Run Code Online (Sandbox Code Playgroud)

被翻译成

$stdout.puts str
Run Code Online (Sandbox Code Playgroud)

也就是说,默认情况下,实现被委托给标准输出(打印到控制台).如果要打印到文件或套接字,则必须puts在文件或套接字类的实例上调用.这完全是OO.


Chr*_*ald 5

Ruby并不完全是 OO(例如,方法不是对象),但在这种情况下,它是.putsKernel#puts,这是简写$stdout.puts.也就是说,您正在调用流的puts方法$stdout并将字符串作为要输出到流的参数传递.所以,当你打电话的时候

puts "foo"
Run Code Online (Sandbox Code Playgroud)

你真打电话:

$stdout.puts("foo")
Run Code Online (Sandbox Code Playgroud)

这与OO完全一致.

  • 方法调用只是消息,当然,消息处理程序本身(我们称之为"方法")是语法结构,它们本身不是直接对象.您可以获取对象句柄,但它们不是对象(对于块也是如此).这通常是人们说"几乎所有Ruby中的东西都是对象"时的含义. (2认同)