关于 Ruby

想知道为什么 Ruby 如此受欢迎吗?它的粉丝称它为一种美丽、艺术的语言。然而,他们说它很方便实用。这是怎么回事呢?

Ruby 创建者的理念

Ruby 是一种平衡的语言。它的创造者,松本行弘(“Matz”),将自己最喜欢的语言(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 所说,“这对你的健康有益。”

  • 在 Ruby 中编写 C 扩展比在 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’s Ruby Interpreter”)或 **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 在 2000 年 5 月 12 日 的 Ruby-Talk 邮件列表中说道。

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

3 Matz 在 Ruby 中的代码块和闭包 中说道,2003 年 12 月 22 日。