如果您想报告此常见问题解答中的错误或提出改进建议,请访问我们的 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 日。经许可转载。