关于 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 中称为类别)。模块是方法的集合。

类可以混合一个模块并免费接收其所有方法。例如,任何实现 each 方法的类都可以混合 Enumerable 模块,该模块添加了一堆使用 each 进行循环的方法。

class MyArray
  include Enumerable
end

一般来说,Ruby 程序员认为这比多重继承(既复杂又可能过于严格)更清晰明了。

Ruby 的视觉外观

尽管 Ruby 通常使用非常有限的标点符号,并且通常更喜欢英文关键字,但仍会使用一些标点符号来修饰 Ruby。Ruby 不需要变量声明。它使用简单的命名约定来表示变量的作用域。

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

这些符号通过允许程序员轻松识别每个变量的角色来增强可读性。也因此不必在每个实例成员前面添加令人厌烦的 self.

超越基础

Ruby 还有许多其他功能,其中包括以下内容:

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

  • Ruby 具有适用于所有 Ruby 对象的真正的标记清除垃圾收集器。无需在扩展库中维护引用计数。正如 Matz 所说,“这对您的健康更有益。”

  • 使用 C 编写 Ruby 扩展比在 Perl 或 Python 中更容易,它提供了一个非常优雅的 API,用于从 C 调用 Ruby。这包括在软件中嵌入 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”。Rubinius 构建在 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 日。