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

 北斗七星 发布于 2023-01-29 17:58

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

例如:

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

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

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

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

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

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

谢谢

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

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

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

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

    正如医生所说,

    puts str
    

    被翻译成

    $stdout.puts str
    

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

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

    puts "foo"
    

    你真打电话:

    $stdout.puts("foo")
    

    这与OO完全一致.

    2023-01-29 18:02 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有