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

官方 Ruby 常见问题解答

如果您想报告此常见问题解答中的错误或提出改进建议,请访问我们的 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 的私有方法,Object 是 Ruby 类层次结构的根。过程式编程从另一个方向巧妙地得到了解决——一切都是对象。如果用户还不理解对象,他们可以假装 def 是一个函数定义,仍然可以完成有用的工作。

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

Ruby,再次像 Smalltalk 一样,提供了闭包和代码块,并以同样的效果使用它们。Ruby 的集合类和迭代器非常出色,比 Python 正在萌芽的临时解决方案(lambda 和列表推导)更强大和优雅。

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

如果您喜欢 Perl,您会喜欢 Ruby,并且会对其语法感到宾至如归。如果您喜欢 Smalltalk,您会喜欢 Ruby,并且会对其语义感到宾至如归。如果您喜欢 Python,您可能会或可能不会被 Python 和 Ruby/Perl 之间巨大的设计理念差异所吓倒。

Ruby 比 Python 复杂得多,但其功能在很大程度上结合得很好。Ruby 设计精良,并且充满了可以为 P3K 挖掘的巧妙想法。我不确定有多少 Python 程序员会被它吸引,尽管它还没有赢得我(暂时)。但它值得认真研究,并且可能对 Perl 构成真正的威胁。

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