从 Python 到 Ruby

Python 也是一种非常不错的通用编程语言。从 Python 转到 Ruby,你会发现需要学习的语法比 Python 稍微多一些。

相似之处

和 Python 一样,在 Ruby 中,…

  • 有一个交互式提示符(称为 irb)。
  • 你可以在命令行上阅读文档(使用 ri 命令而不是 pydoc)。
  • 没有特殊的行终止符(除了通常的换行符)。
  • 字符串字面量可以像 Python 的三引号字符串一样跨越多行。
  • 方括号用于列表,大括号用于字典(在 Ruby 中称为“哈希”)。
  • 数组的工作方式相同(将它们相加会得到一个长数组,但像这样组合它们 a3 = [ a1, a2 ] 会得到一个数组的数组)。
  • 对象是强类型和动态类型的。
  • 一切皆为对象,变量只是对对象的引用。
  • 尽管关键字略有不同,但异常的工作方式大致相同。
  • 你有嵌入式文档工具(Ruby 的称为 rdoc)。
  • 对函数式编程有很好的支持,包括头等函数、匿名函数和闭包。

不同之处

与 Python 不同,在 Ruby 中,…

  • 字符串是可变的。
  • 你可以创建常量(你不打算更改其值的变量)。
  • 有一些强制性的情况约定(例如,类名以大写字母开头,变量以小写字母开头)。
  • 只有一种列表容器(数组),它是可变的。
  • 双引号字符串允许转义序列(如 \t)和特殊的“表达式替换”语法(允许你将 Ruby 表达式的结果直接插入其他字符串,而无需 "add " + "strings " + "together")。单引号字符串类似于 Python 的 r"原始字符串"
  • 没有“新式”和“旧式”类。只有一种。(Python 3+ 没有这个问题,但它与 Python 2 不完全向后兼容。)
  • 你永远不会直接访问属性。在 Ruby 中,一切都是方法调用。
  • 方法调用的括号通常是可选的。
  • publicprivateprotected 来强制访问,而不是 Python 的 _自愿的_ 下划线 __约定__
  • 使用“混入”而不是多重继承。
  • 你可以添加或修改内置类的方法。两种语言都允许你在任何时候打开和修改类,但 Python 禁止修改内置类 - Ruby 则不然。
  • 你有 truefalse,而不是 TrueFalse(以及 nil 而不是 None)。
  • 在测试真值时,只有 falsenil 的计算结果为假。其他一切都为真(包括 00.0""[])。
  • elsif 而不是 elif
  • require 而不是 import。但除此之外,用法相同。
  • 通常在事物上方的行中的注释(而不是下面的文档字符串)用于生成文档。
  • 有很多快捷方式,虽然让你需要记住更多东西,但你会很快学会它们。它们往往使 Ruby 变得有趣且高效。
  • 一旦设置了变量,就没有办法取消设置它(如 Python 的 del 语句)。你可以将变量重置为 nil,允许旧内容被垃圾回收,但只要该变量在作用域内,它将保留在符号表中。
  • yield 关键字的行为有所不同。在 Python 中,它会将执行返回到函数调用之外的作用域。外部代码负责恢复该函数。在 Ruby 中,yield 将执行作为最终参数传递的另一个函数,然后立即恢复。
  • Python 仅支持一种匿名函数,lambda,而 Ruby 包含块、Proc 和 lambda。