内容 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11

官方 Ruby FAQ

如果您希望报告错误或对本 FAQ 提出改进建议,请访问我们的 GitHub 仓库,并提出 issue 或 pull request。

Ruby 与...相比如何?

Ruby 与 Python 相比如何?

Python 和 Ruby 都是面向对象的语言,它们提供了从过程式到面向对象的编程风格的平滑过渡。相比之下,Smalltalk 则是纯粹面向对象的——在你理解了对象、继承和庞大的 Smalltalk 类层次结构之前,你什么也做不了。通过提供过程式编程的“辅助轮”,Python 和 Ruby “修正”了可能让 Smalltalk 无法进入主流的特性之一。这两种语言通过从相反的方向解决这个问题而有所不同。

Python 是一种混合语言。它有用于过程式编程的函数和用于面向对象编程的对象。Python 通过允许函数和方法相互转换来实现两种世界的融合,通过每个方法定义中的显式 self 参数。当一个函数被插入到一个对象中时,第一个参数会自动成为接收者的引用。

Ruby 是一种纯粹的面向对象语言,可以伪装成过程式语言。它没有函数,只有方法调用。在 Ruby 方法中,接收者(也称为 self)是一个隐藏的参数,类似于 C++ 中的 this。类定义之外的 def 语句(在 Python 中定义一个函数)实际上在 Ruby 中定义了一个方法。这些伪函数成为类 Object(Ruby 类层次结构的根)的私有方法。过程式编程从另一个方向得到了巧妙的解决——一切都是对象。如果用户还不理解对象,他们可以假装 def 是一个函数定义,仍然可以完成有用的工作。

Ruby 的面向对象纯粹性提供了 Python 缺乏或仍在努力实现的一些特性:统一的类型/类层次结构、元类、子类化一切的能力,以及统一的方法调用(没有像 len() 是函数但 items() 是方法这种糟糕的做法)。Ruby 和 Smalltalk 一样,只支持单重继承,但它有一个非常强大的混入(mixin)概念:类定义可以包含一个模块,该模块会将该模块的方法、常量等插入到类中。

Ruby,也像 Smalltalk 一样,提供了闭包和代码块,并有效地利用了它们。Ruby 的集合类和迭代器非常出色,比 Python 正在出现的临时解决方案(lambda 和列表推导式)强大得多,也更优雅。

Ruby 的语法和设计理念深受 Perl 的影响。它有很多语法上的可变性。语句修饰符(ifunlesswhileuntil 等)可以出现在任何语句的末尾。一些关键字是可选的(例如,if 语句中的 then)。方法调用有时可以省略括号。方法接收者通常也可以省略。很多很多东西直接借鉴自 Perl。内置的正则表达式,$_ 及其同类,here documents,单引号/双引号字符串的区别,$@ 前缀用于区分不同类型的名称等等。

如果你喜欢 Perl,你会喜欢 Ruby,并且对它的语法感到非常自在。如果你喜欢 Smalltalk,你会喜欢 Ruby,并且对它的语义感到非常自在。如果你喜欢 Python,你可能会或不会被 Python 和 Ruby/Perl 之间巨大的设计理念差异所排斥。

Ruby 比 Python 复杂得多,但它的特性在很大程度上是协调一致的。Ruby 设计精良,充满了可能被 P3K 挖掘的绝妙想法。但我不太确定有多少 Python 程序员会被它吸引——它还没有赢得我(至今)。但它值得认真研究,并且可能是 Perl 的一个真正的威胁。

John Dell’Aquila 于 2000 年 11 月 17 日在 comp.lang.python 发布。经许可转载。