关于 Ruby

想知道 Ruby 为什么如此受欢迎吗?它的爱好者称它为一门优美、富有艺术性的语言。然而,他们也说它既实用又方便。这是怎么回事?

Ruby 创造者的理念

Ruby 是一门注重平衡的语言。它的创造者 Yukihiro “Matz” Matsumoto,融合了他最喜欢的几种语言(Perl、Smalltalk、Eiffel、Ada 和 Lisp)的特点,创造了一门兼顾函数式编程和命令式编程的新语言。

他曾多次表示,他“试图让 Ruby 自然,而非简单”,就像生活一样。

在此基础上,他补充道:

Ruby 外表看起来简单,但内部却非常复杂,就像我们的人体一样1

关于 Ruby 的发展

自 1995 年公开发布以来,Ruby 吸引了全球无数忠实的开发者。2006 年,Ruby 获得了大规模的认可。世界各大主要城市都成立了活跃的用户组,Ruby 相关的会议也座无虚席。

Ruby-Talk,这主要是关于 Ruby 语言讨论的 邮件列表,在 2006 年平均每天的邮件数量达到 200 封。近年来,由于社区规模的扩大,讨论从一个中心列表分散到许多小型群组,其邮件数量有所下降。

在衡量全球编程语言增长和受欢迎程度的许多指数(如 TIOBE 指数)中,Ruby 都排在前 10 名。其增长很大程度上归功于使用 Ruby 编写的软件的流行,特别是 Ruby on Rails Web 框架。

Ruby 也 完全免费。不仅免费使用,而且可以自由使用、复制、修改和分发。

将一切视为对象

最初,Matz 考察了其他语言以寻找理想的语法。回忆起他的探索过程,他说:“我想要一种比 Perl 更强大,比 Python 更面向对象的脚本语言2。”

在 Ruby 中,一切皆对象。每一条信息和代码都可以拥有自己的属性和行为。面向对象编程将属性称为实例变量,将行为称为方法。Ruby 的纯粹面向对象的方法最常通过一段将行为应用于数字的代码来展示。

5.times { print "We *love* Ruby -- it's outrageous!" }

在许多语言中,数字和其他原始类型不是对象。Ruby 受到 Smalltalk 语言的影响,为所有类型都提供了方法和实例变量。这简化了 Ruby 的使用,因为适用于对象的规则同样适用于 Ruby 的所有部分。

Ruby 的灵活性

Ruby 被认为是一门灵活的语言,因为它允许用户自由地修改其各个部分。Ruby 的核心部分可以根据需要移除或重新定义。现有部分也可以进行扩展。Ruby 尽量不限制程序员。

例如,加法是通过加号(+)运算符执行的。但是,如果您愿意使用可读的单词 plus,可以将这样的方法添加到 Ruby 内置的 Numeric 类中。

class Numeric
  def plus(x)
    self.+(x)
  end
end

y = 5.plus 6
# y is now equal to 11

Ruby 的运算符是对方法的语法糖。您也可以重新定义它们。

块:一种真正富有表现力的特性

Ruby 的块也被视为灵活性的重要来源。程序员可以为任何方法附加一个闭包,来描述该方法应该如何执行。这个闭包被称为,并且已成为从 PHP 或 Visual Basic 等命令式语言转到 Ruby 的新手最喜欢的功能之一。

块受到函数式语言的启发。Matz 说:“在 Ruby 的闭包中,我想尊重 Lisp 的文化3。”

search_engines =
  %w[Google Yahoo MSN].map do |engine|
    "http://www." + engine.downcase + ".com"
  end

在上面的代码中,块在 do ... end 结构内定义。map 方法将块应用于提供的单词列表。Ruby 中的许多其他方法都留有一个“洞”,供程序员编写自己的块来填充该方法应执行的详细操作。

Ruby 和 Mixin

与许多面向对象语言不同,Ruby 只支持单一继承,**这是故意的**。但 Ruby 了解模块(在 Objective-C 中称为 Categories)的概念。模块是方法的集合。

类可以混合(mixin)一个模块,并免费获得其所有方法。例如,任何实现了 each 方法的类都可以混合(mixin)Enumerable 模块,该模块添加了一系列使用 each 进行循环的方法。

class MyArray
  include Enumerable
end

总的来说,Rubyist 认为这比多重继承要清晰得多,因为多重继承复杂且可能过于受限。

Ruby 的视觉外观

虽然 Ruby 通常使用非常有限的标点符号,并且通常偏好英文关键字,但一些标点符号用于装饰 Ruby。Ruby 不需要变量声明。它使用简单的命名约定来表示变量的作用域。

  • var 可以是局部变量。
  • @var 是实例变量。
  • $var 是全局变量。

这些符号通过允许程序员轻松识别每个变量的角色来增强可读性。这样也无需在每个实例成员前加上烦人的 self.

基础之上

Ruby 拥有丰富的其他功能,其中包括以下几点:

  • Ruby 具有类似 Java 或 Python 的异常处理功能,可以轻松处理错误。

  • Ruby 为所有 Ruby 对象提供了一个真正的标记-清除垃圾收集器。无需在扩展库中维护引用计数。正如 Matz 所说:“这对您的健康更好。”

  • 在 Ruby 中编写 C 扩展比在 Perl 或 Python 中更容易,其用于从 C 调用 Ruby 的 API 非常优雅。这包括用于将 Ruby 嵌入软件作为脚本语言使用的调用。也提供了 SWIG 接口。

  • 如果操作系统允许,Ruby 可以动态加载扩展库。

  • Ruby 具有与操作系统无关的线程。因此,在所有运行 Ruby 的平台上,您都可以使用多线程,无论操作系统是否支持,即使是在 MS-DOS 上!

  • Ruby 的可移植性极高:它主要在 GNU/Linux 上开发,但可以在多种 UNIX、macOS、Windows、DOS、BeOS、OS/2 等系统上运行。

其他 Ruby 实现

Ruby 作为一门语言,有几种不同的实现。本页面讨论的是社区中通常称为 **MRI**(“Matz 的 Ruby 解释器”)或 **CRuby**(因为它用 C 编写)的参考实现,但也有其他实现。它们在某些情况下很有用,可以提供与其他语言或环境的额外集成,或者具有 MRI 没有的特殊功能。

这是一个列表:

  • JRuby 是基于 JVM(Java 虚拟机)的 Ruby,它利用 JVM 的优化 JIT 编译器、垃圾收集器、并发线程、工具生态系统以及大量的库。
  • Rubinius 是“用 Ruby 编写的 Ruby”。它构建在 LLVM 之上,拥有一个简洁的虚拟机,其他语言也正在构建在其之上。
  • TruffleRuby 是基于 GraalVM 的高性能 Ruby 实现。
  • mruby 是 Ruby 语言的一个轻量级实现,可以链接并嵌入到应用程序中。其开发由 Ruby 的创造者 Yukihiro “Matz” Matsumoto 领导。
  • IronRuby 是一个“与 .NET Framework 紧密集成”的实现。
  • MagLev 是“一个快速、稳定、支持集成对象持久化和分布式共享缓存的 Ruby 实现”。
  • Cardinal 是“用于 Parrot 虚拟机”(Perl 6)的 Ruby 编译器。

要查看更完整的列表,请参见 Awesome Rubies

参考文献

1 Matz 在 Ruby-Talk 邮件列表中发言,2000 年 5 月 12 日

2 Matz 在《Ruby 创造者访谈》中,2001 年 11 月 29 日。

3 Matz 在《Ruby 中的块和闭包》中,2003 年 12 月 22 日。