从 Python 迁移到 Ruby
Python 是另一种非常不错的通用编程语言。从 Python 转到 Ruby,你会发现需要学习的语法比 Python 稍微多一些。
相似之处
和 Python 一样,在 Ruby 中,…
- 有一个交互式提示(称为
irb)。 - 你可以在命令行阅读文档(使用
ri命令而不是pydoc)。 - 没有特殊的行终止符(除了通常的换行符)。
- 字符串字面量可以像 Python 的三引号字符串一样跨越多行。
- 方括号用于列表,花括号用于字典(在 Ruby 中称为“哈希”)。
- 数组的工作方式相同(将它们相加会形成一个长数组,但像这样组合它们
a3 = [ a1, a2 ]会得到一个数组的数组)。 - 对象是强类型和动态类型的。
- 一切皆对象,变量只是对象的引用。
- 虽然关键字略有不同,但异常的工作方式大致相同。
- 你拥有嵌入式文档工具(Ruby 的称为 rdoc)。
- 函数是一等公民,支持匿名函数和闭包,具有良好的函数式编程支持。
不同之处
与 Python 不同,在 Ruby 中,…
- 字符串是可变的。
- 你可以创建常量(你不打算更改其值的变量)。
- 存在一些强制性的命名约定(例如,类名以大写字母开头,变量以小写字母开头)。
- 只有一种列表容器(Array),并且它是可变的。
- 双引号字符串允许转义序列(如
\t)和特殊的“表达式替换”语法(允许你将 Ruby 表达式的结果直接插入到其他字符串中,而无需"add " + "strings " + "together")。单引号字符串类似于 Python 的r"raw strings"。 - 没有“新式”和“旧式”类。只有一种。 (Python 3+ 没有这个问题,但它与 Python 2 不完全向后兼容。)
- 你从不直接访问属性。在 Ruby 中,一切都是方法调用。
- 方法调用的括号通常是可选的。
- 有
public、private和protected来强制访问,而不是 Python 的_voluntary_下划线__convention__。 - 使用“混入”(mixins)代替多重继承。
- 你可以添加或修改内置类的所有方法。这两种语言都允许你在任何时候打开和修改类,但 Python 禁止修改内置类 — Ruby 则不。
- 你有
true和false而不是True和False(以及nil而不是None)。 - 在进行真值测试时,只有
false和nil会被评估为假值。其他所有值都为真(包括0、0.0、""和[])。 - 它是
elsif而不是elif。 - 它是
require而不是import。否则,用法相同。 - 通常风格的注释写在事物上方的行(而不是下方的文档字符串)用于生成文档。
- 有许多快捷方式,尽管它们增加了学习的负担,但你很快就会掌握它们。它们往往使 Ruby 变得有趣且非常高效。
- 一旦设置了变量,就没有办法取消设置它(不像 Python 的
del语句)。你可以将变量重置为nil,允许旧内容被垃圾回收,但变量在作用域内时仍会保留在符号表中。 yield关键字的行为不同。在 Python 中,它将执行返回到函数调用范围之外。外部代码负责恢复函数。在 Ruby 中,yield将执行作为最后一个参数传递的另一个函数,然后立即恢复。- Python 只支持一种匿名函数,即 lambda,而 Ruby 包含 blocks、Procs 和 lambdas。