Ruby教程

Ruby发明者的理想

Ruby 是一个注重均衡的语言,它的发明者松本行弘(Yukihiro “Matz” Matsumoto),混合了他喜欢的多门语言(Perl、 Smalltalk、 Eiffel、 Ada 和 Lisp),创造出了一种兼具函数式编程和命令式编程特色的新语言。

他常说,他是 “试着让 Ruby 更自然,而不是更简单”,让一切符合生活常规。除此之外,他还提到:Ruby 就像人的身体一样,表面上看来简单,但是内部却相当复杂。

Ruby的成长

自从 1995 年公开发布以来,Ruby 在全球吸引了许多忠实的程序员。2006 年,Ruby 得到广泛接受,各大城市都有活跃的用户组,以及 Ruby 相关的开发者大会。

在主要的邮件列表 Ruby-Talk 中,讨论 Ruby 语言的消息攀升到每日 200 封。近几年,消息数量有所下降,因为社区在不断变大,由一个集中的邮件列表分成了很多小型的讨论组。

Ruby 经常位于全球编程语言成长和流行度指数的前十名(比如 TIOBE)。造成 Ruby 如此快速成长的原因很大程度上是因为使用 Ruby 编写的 Web 框架 Ruby on Rails 非常受欢迎。

Ruby 完全免费,除了不收费之外,还可以自由使用、复制、修改和分发。

把一切视为对象

最初,Matz 从其它语言中找寻理想的语法。回想他的研究,他说,“我想要一种比 Perl 更强大、比 Python 更面向对象的脚本语言”。

在 Ruby 中,一切皆对象。所有的信息和代码都拥有属性和行为。面向对象编程称属性为实例变量(instance variables),称行为为方法(methods)。 从下列代码可以看出,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 现在等于 11

Ruby 的运算符只是语法糖 (syntactic sugar),随时可以重定义。

代码块

表现力强大的特性,Ruby 的代码块非常灵活。程序员可以给任何方法添加闭包,指明方法该如何工作。闭包也叫代码块,是从其他命令式语言(比如 PHP、 Visual Basic 等)转到 Ruby 的初学者最喜欢使用的特性。

代码块取自函数式语言。Matz 说:“我希望在 Ruby 的闭包中融入 Lisp 的文化。”

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

在上述代码中,代码块使用 do ... end 结构表述。map 方法把代码块应用到单词列表上。Ruby 中有很多方法都留出了切入点,让程序员编写代码块,控制方法具体的操作细节。

Ruby中的混入

与其他面向对象语言不同,Ruby “有意” 只提供单继承。不过 Ruby 有模块(在 Objective-C 中叫做类别)。模块是一系列方法。

类可以混入模块,得到模块中的所有方法。例如,所有实现 each 方法的类可以混入 Enumerable 模块,得到这个模块提供的所有方法,当然这些方法都会调用 each 做循环。

class MyArray include Enumerable end

一般来说,Ruby 高手认为这种方式比多重继承更简洁。多重继承复杂,而且可能有太多限制。

Ruby的视觉呈现

尽管 Ruby 只用很少的符号,而且偏向使用英文单词做关键字,但是也用一些符号装饰 Ruby。在 Ruby 中,不需要提前声明变量。Ruby 使用简单的命名约定指明变量的作用域。

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

这些符号能让程序员轻易识别变量的作用。此外,实例成员前面无需加上烦人的 self.

更上层楼

Ruby 还有其他众多特性,下面列举一些:

  • Ruby 的异常处理特性与 Java 和 Python 类似,易于处理错误。
  • Ruby 拥有一个针对所有对象的标识-清扫(mark-and-sweep)式垃圾回收程序)。使用者无需维护扩展库中的引用计数。正如 Matz 所说:“这对您的健康有益。”
  • 为 Ruby 写 C 语言 扩展比 Perl 和 Python 容易,因为 Ruby 有一个非常雅致的 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 Virtual Machine)的 Ruby 实现,利用了 JVM 中优秀的 JIT 编译器、垃圾回收程序、并发线程、工具生态系统和大量的库。
Rubinius 是用 “Ruby 编写的 Ruby”。构建于 LLVM 之上,Rubinius 跑在一个很灵活的虚拟机上,别的语言也可以构建于这个虚拟机上。
mruby 是 Ruby 语言的轻量级实现,可以链接或嵌入到程序之中。mruby 由 Ruby 的创建者松本行弘(Matz)领导开发。
IronRuby 是一个 “与 .NET 框架紧密集成” 的实现。
MagLev 是 “一个快速、稳定的 Ruby 实现,支持集成对象持久化和分布式共享缓存”。
Cardinal 是一个 “为 Parrot 虚拟机 (Perl 6)编写的 Ruby 编译器”。