Ruby 是一个注重均衡的语言,它的发明者松本行弘(Yukihiro “Matz” Matsumoto),混合了他喜欢的多门语言(Perl、 Smalltalk、 Eiffel、 Ada 和 Lisp),创造出了一种兼具函数式编程和命令式编程特色的新语言。
他常说,他是 “试着让 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 不想阻碍程序员的创造力。
比如,加号(+
)是做加法的运算符。如果你更喜欢使用易读的 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 有模块(在 Objective-C 中叫做类别)。模块是一系列方法。
类可以混入模块,得到模块中的所有方法。例如,所有实现 each
方法的类可以混入 Enumerable
模块,得到这个模块提供的所有方法,当然这些方法都会调用 each
做循环。
class MyArray
include Enumerable
end
一般来说,Ruby 高手认为这种方式比多重继承更简洁。多重继承复杂,而且可能有太多限制。
尽管 Ruby 只用很少的符号,而且偏向使用英文单词做关键字,但是也用一些符号装饰 Ruby。在 Ruby 中,不需要提前声明变量。Ruby 使用简单的命名约定指明变量的作用域。
var
可能是局部变量@var
是实例变量$var
是全局变量这些符号能让程序员轻易识别变量的作用。此外,实例成员前面无需加上烦人的 self.
。
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 编译器”。 |