本书是 Ruby 编程语言的教程和参考书。使用 Ruby,您将编写更好的代码、提高工作效率并更享受编程。

这些都是大胆的主张,但我们认为阅读本书后您会同意这些主张。我们有经验支持这一信念。

作为务实的程序员,我们尝试了很多很多语言来寻找让我们的生活更轻松的工具,寻找帮助我们更好地完成工作的工具。然而,直到现在,我们一直对我们使用的语言感到沮丧。

我们的工作是解决问题,而不是用勺子喂编译器,所以我们喜欢适应我们的动态语言,没有武断的、严格的规则。我们需要清晰,以便我们可以使用我们的代码进行交流。我们重视简洁性以及准确有效地用代码表达需求的能力。我们编写的代码越少,出错的可能性就越小。 (我们的手腕和手指也很感激。)

我们希望尽可能高效,所以我们希望我们的代码第一次运行;在调试器中花费的时间是从开发时钟中窃取的时间。如果我们可以在编辑代码时试用代码,也会有所帮助;如果您必须等待 2 小时的制作周期,您不妨使用打孔卡并提交您的工作以进行批量编译。

我们想要一种在高抽象层次上工作的语言。语言级别越高,我们将需求转化为代码的时间就越少。

当我们发现 Ruby 时,我们意识到我们已经找到了我们一直在寻找的东西。与我们使用过的任何其他语言相比,Ruby 不会妨碍您。您可以专注于解决手头的问题,而不是为编译器和语言问题而苦苦挣扎。这就是它可以帮助您成为更好的程序员的方式:让您有机会花时间为您的用户而不是编译器创建解决方案。

Ruby Sparkles

采用真正的面向对象语言,例如 Smalltalk。放弃不熟悉的语法,转而使用更传统的、基于文件的源代码。现在加入对 Python 和 Perl 等语言的灵活性和便利性的良好衡量。

你最终得到了 Ruby。

OO 爱好者会在 Ruby 中找到很多喜欢的东西:诸如纯面向对象(一切都是对象)、元类、闭包、迭代器和无处不在的异构集合之类的东西。 Smalltalk 用户会感到宾至如归(而 C++ 和 Java 用户会感到嫉妒)。

同时,Perl 和 Python 向导会发现许多他们最喜欢的特性:完整的正则表达式支持、与底层操作系统的紧密集成、方便的快捷方式和动态评估。

Ruby 很容易学习。日常任务的编码很简单,一旦你完成了它们,它们就很容易维护和发展。看似困难的事情往往最终证明并不困难。 Ruby 遵循最小意外原则 —— 事情会按照你期望的方式工作,很少有特殊情况或例外。当你在编程时,这确实会有所作为。

我们称 Ruby 为透明语言。我们的意思是,Ruby 不会掩盖您在大量语法背后编写的解决方案,也不会为了完成简单的事情而编写大量支持代码。使用 Ruby,您可以编写接近问题域的程序。与其不断地将您的想法和设计映射到大多数语言的行人级别,您会发现使用 Ruby 可以直接表达它们并优雅地表达它们。这意味着您可以更快地编码。这也意味着您的程序保持可读性和可维护性。

使用 Ruby,我们经常惊讶于我们可以一次编写多少代码,代码第一次就可以运行。语法错误非常少,没有类型冲突,并且错误比平时少得多。这是有道理的:出错的可能性较小。没有麻烦的分号在每行的末尾机械地输入。没有麻烦的类型声明保持同步(尤其是在单独的文件中)。没有多余的话只是为了让编译器满意。没有容易出错的框架代码。

那么为什么要学习 Ruby?因为我们认为它会帮助您更好地编程。它将帮助您专注于手头的问题,减少分心。它会让你的生活更轻松。

Ruby 是一种什么样的语言?

在过去,语言之间的区别很简单:它们要么是编译的,如 C 或 Fortran,要么是解释的,如 BASIC。编译语言为您提供速度和低级访问;解释型语言高级但速度较慢。

时代在变,事情不再那么简单。一些语言设计者已经开始将他们的创作称为“脚本语言”。我们猜测他们的意思是他们的语言是解释性的,可以用来替换批处理文件和 shell 脚本,协调其他程序的行为和底层操作系统。 Perl、TCL 和 Python 都被称为脚本语言。

究竟什么是脚本语言?坦率地说,我们不知道这是否值得做出区分。在 Ruby 中,您可以访问所有底层操作系统功能。您可以在 Ruby 中执行与在 Perl 或 Python 中相同的操作,并且可以更简洁地执行此操作。但 Ruby 是完全不同的。它也是一种真正的编程语言,具有强大的理论基础和优雅、轻量级的语法。你可以用 Ruby 编写一堆“脚本”,但你可能不会。相反,您将更倾向于设计一个解决方案,生成一个易于理解、易于维护的程序,以及在未来扩展和重用的小菜一碟。

尽管我们已经将 Ruby 用于脚本作业,但大多数时候我们将它用作通用编程语言。我们已经使用它来编写 GUI 应用程序和中间层服务器进程,并且我们正在使用它来格式化本书的大部分内容。其他人则使用它来管理服务器机器和数据库。 Ruby 提供网页服务,与数据库交互并生成动态内容。人们正在用 Ruby 编写人工智能和机器学习程序,并且至少有一个人正在使用它来研究自然进化。 Ruby 正在寻找一个家作为探索性数学的工具。世界各地的人们都在使用它作为将所有不同应用程序粘合在一起的一种方式。它确实是一种用于在各种问题领域中生成解决方案的出色语言。

Ruby 适合我吗?

Ruby 并不是解决程序员问题的万能灵丹妙药。总会有你需要一种特定语言的时候:环境可能决定它,你可能有你需要的特殊库,性能问题,或者只是培训问题。我们还没有完全放弃 Java 和 C++ 之类的语言(尽管有时我们希望可以)。

但是,Ruby 可能比您想象的更适用。它很容易扩展,无论是从语言内部还是通过链接到第三方库。它可以跨多个平台移植。它相对轻量级,仅消耗适度的系统资源。而且很容易学习;我们知道有人在拿到本书草稿后的一天内就将 Ruby 代码放入了生产系统。我们使用 Ruby 实现了 X11 窗口管理器的一部分,该任务通常被认为是严格的 C 编码。 Ruby 表现出色,帮助我们在数小时内编写代码,否则需要数天时间。

一旦您对 Ruby 感到满意,我们认为您将继续使用它作为您选择的语言。

我们为什么要写这本书?

所以我们刚写完 The Pragmatic Programmer,我们的家人又开始和我们说话了,突然我们觉得有必要再写一本书。 为什么? 我们猜想这归结为一种传教士的热情。

Ruby 由日本的 Yukihiro Matsumoto (Matz) 创建。 自 1995 年以来,它在日本的受欢迎程度以惊人的速度增长。 有传言说 Ruby 在日本比 Python 更受欢迎。 但迄今为止,大部分详细的 Ruby 文档都是日文的。 它可能不是您偶然发现的一种编程语言。

我们想传播这个词,让更多日本以外的人使用 Ruby 并享受其中的好处,所以我们决定用英文记录 Ruby。 最初只是一个小项目的项目逐渐增长……

Ruby 版本

本书记录了 2000 年 9 月发布的 Ruby 1.6 版。

Ruby 版本编号遵循用于许多其他开源项目的相同方案。 具有偶数版本号(1.0、1.2、1.4 等)的版本是稳定的公开版本。 这些是预先打包并在各种 Ruby 网站上提供的版本。

该软件的开发版本具有奇数的颠覆号,例如 1.1 和 1.3。 这些您必须自己下载和构建,如第 xxvii 页的方框中所述。

安装 Ruby

您可以从 ftp://ftp.netlab.co.jp/pub/lang/ruby 或从附录 C 第 526 页列出的镜像站点获取 Ruby。在那里您将找到最新的稳定版本以及各种开发 发布。

你总能找到 Ruby 的源代码版本; 您还可以找到适用于 Windows 或其他操作系统的预构建二进制文件(例如 http://www.pragmaticprogrammer.com/ruby/downloads/ruby-install.html 上的适用于 Windows 的 Ruby 的二进制分发版)。

边栏:最新的 Ruby
对于那些只需要处于最新、热门和未经测试的前沿(就像我们在编写本书时一样)的人,您可以直接从开发人员的工作存储库中获取开发版本。

Ruby 开发人员使用 CVS(并发版本系统,可从 http://www.cvshome.com 免费获得)作为他们的修订控制系统。 您可以通过执行以下 CVS 命令以匿名用户身份从存档中签出文件:

% cvs -d :pserver:anonymous@cvs.netlab.co.jp:/home/cvs
login
(登录到anonymous@cvs.netlab.co.jp)
CVS password:guest
% cvs -d :pserver:anonymous@cvs.netlab.co.jp:/home/cvs
checkout ruby

完整的源代码树,就像开发人员上次留下的一样,现在将被复制到您机器上的“ruby”子目录中,从世界另一端的存储库中更新您的本地源代码树。 这不是活着的好时机吗?

构建 Ruby

在 Ruby 发行版中,您会找到一个名为 README 的文件,其中详细解释了安装过程。 总而言之,您在基于 POSIX 的系统上构建 Ruby,使用与大多数其他开源应用程序相同的四个命令:./configure、make、make testmake install。 您可以在其他环境(包括 Windows)下构建 Ruby,方法是使用 POSIX 仿真环境,例如 cygwin [有关详细信息,请参见 http://sourceware.cygnus.com/cygwin。] 或使用本机编译器 —- 参考 ntsetup. bat 在发行版的 win32 子目录中作为起点。

运行 Ruby

现在已经安装了 Ruby,您可能想要运行一些程序。与编译环境不同,Ruby 有两种运行方式 —— 交互方式和作为程序运行。

交互式 Ruby

以交互方式运行 Ruby 最简单的方法就是在 shell 提示符下键入“ruby”。

  1. % ruby
  2. puts "Hello, world!"
  3. ^D
  4. Hello, world!

在这里,我们输入了单个 puts 表达式和一个文件结尾字符(在我们的系统上是 control-D)。这个过程是有效的,但如果你打错字会有点痛苦,而且你在打字时看不到发生了什么。

在 Ruby 发行版的sample 目录中,您将找到一个名为“eval.rb”的脚本。通过向我们展示输入的每个表达式的值,它更进一步:

  1. % cd sample
  2. % ruby eval.rb
  3. ruby> a = "Hello, world!"
  4. "Hello, world!"
  5. ruby> puts a
  6. Hello, world!
  7. nil
  8. ruby> ^D
  9. %

在这里,我们可以看到 puts 的输出,然后是 puts 的返回值(即 nil)。

这一切都很好,除了多行表达式不起作用,并且您不能编辑您所在的行,或者返回并使用以前的行(就像您可能在 shell 中使用命令历史记录一样)。

对于 eval.rb 的下一步,我们有 irb —— 交互式 Ruby。irb 是一个 Ruby Shell,具有命令行历史、行编辑功能和作业控制。它非常可配置并且有很多选项,以至于它有自己的附录,从第 517 页开始。我们建议您熟悉 irb,以便您可以交互地尝试我们的一些示例。

Ruby 程序

最后,您可以像运行任何其他 shell 脚本、Perl 程序或 Python 程序一样从文件运行 Ruby 程序。您可以简单地运行 Ruby,将脚本名称作为参数:

  1. % ruby myprog.rb

或者你可以使用 Unix `shebang'' 符号作为程序文件的第一行。[_如果你的系统支持它,你可以避免使用 _#!/usr/bin/env ruby_ 在 shebang 行中硬编码 Ruby 的路径,它将在您的路径中搜索 _ruby`,然后执行它。]

  1. #!/usr/local/bin/ruby -w
  2. puts "Hello, World!"

如果您使该源文件可执行(例如,使用 chmod +x myprog.rb),Unix 允许您将文件作为程序运行:

  1. % ./myprog.rb
  2. Hello, World!

您可以在 Microsoft Windows 下使用文件关联执行类似的操作。

资源

访问 Ruby 网站 http://www.rubycentral.comhttp://www.ruby-lang.org,看看有什么新东西,并在新闻组或邮件列表上与其他 Ruby 用户聊天(见附录 C) 。

我们当然希望收到您的来信。 欢迎评论、建议、文本中的错误和示例中的问题。 给我们发电子邮件:
mailto:rubybook@pragmaticprogrammer.com

如果您告诉我们书中的错误,我们会将它们添加到勘误表中:
http://www.pragmaticprogrammer.com/ruby/errata/errata.html

最后,http://www.pragmaticprogrammer.com/ruby 还包含本书几乎所有示例的源代码,按页面组织。

致谢

一本书是一项艰巨的任务,如果没有我们所有新老朋友的帮助,我们永远无法完成。我们很自豪能将 Addison-Wesley 的团队列为我们的老朋友:Mike Hendrickson、John Fuller、乐于助人的 Julie Steele 和出色的 Julie DiNicola。谢谢你们。

我们的评审员很棒。我们让他们在一些非常紧迫的最后期限前完成,他们为我们完成了任务。回顾一本充满技术细节的书并不容易,因此我们特别感谢 George Coe、Bob Davison、Jeff Deifik、Hal Fulton、Tadayoshi Funaba、Clemens Hintze、Kazuhiro Hiwada、Kikutani Makoto、Mike Linksvayer、Aleksi Niemelä、Lew Perin、Jared Richardson、Armin Roehrl、Conrad Schneiker、Patrick Schoenbach 和 Eric Vought。还要感谢 Addison-Wesley 的两位 Julies 协调这项真正的国际努力。

有几个人在本书的特定领域帮助我们。 Tadayoshi Funaba 与我们交换了无数的电子邮件,直到我们终于理解了 Date 模块。 Guy Decoux 和 Clemens Hintze 耐心地回答了我们关于编写 Ruby 扩展的问题,Masaki Suketa 帮助我们理解了 WinOLE 模块。

尽管大部分原始 Ruby 文档都是日文的,但越来越多的英文翻译,主要由日本开发人员承担,他们的英语技能从未停止让我们惊叹。尽管对这项工作的个人贡献太多,无法说出每位作者的名字,但我们还是要特别指出后藤健太郎,他制作了大量高质量的文档并将其放到网上。

最后,我们要感谢 Ruby 的创造者 Yukihiro ``Matz’’ Matsumoto。我们已经数不清我们向他提出的问题数量,以及他回复的耐心和详细答案的数量。除了创造一种真正美妙的语言外,Matz 还培养了一种非常支持和开放的文化,这种语言可以在其中繁荣发展。

谢谢你们。 Domo arigato gozaimasu。

Dave ThomasAndy Hunt

THE PRAGMATIC PROGRAMMERS
http://www.pragmaticprogrammer.com

符号约定

在本书中,我们使用以下印刷符号。
文字代码示例使用类似打字机的字体显示:

  1. class SampleCode
  2. def run
  3. #...
  4. end
  5. end

在正文中,Fred#doIt 是对类 Fred 的实例方法 (doIt) 的引用,而 Fred.new [在其他一些 Ruby 文档中,您可能会看到类方法写为 _Fred::new_。 这是完全有效的 Ruby 语法; 我们只是碰巧觉得 _Fred.new_ 阅读起来不那么分散注意力。] 是一个类方法,而 Fred::EOF 是一个类常量。

本书包含许多 Ruby 代码片段。 在可能的情况下,我们试图展示它们运行时会发生什么。 在简单的情况下,我们将表达式的值显示在与表达式相同的行上。 例如:

  1. a = 1
  2. b = 2
  3. a + b » 3

有时,我们也对赋值语句的值感兴趣,在这种情况下我们将展示它们。

  1. a = 1 » 1
  2. b = 2 » 2
  3. a + b » 3

如果程序产生更复杂的输出,我们将其显示在程序代码下方:

  1. 3.times { puts "Hello!" }

产生:

  1. Hello!
  2. Hello!
  3. Hello!

在一些库文档中,我们希望显示输出中出现空格的位置。 您将看到这些空格作为“[可见空格]”字符。

命令行调用以罗马字体显示,文字文本以斜体字体显示,您提供的参数以斜体字体显示。 可选元素显示在大方括号中。

  1. ruby [
  2. flags
  3. ]*
  4. [
  5. progname
  6. ] [
  7. arguments
  8. ]+

摘自《Programming Ruby - The Pragmatic Programmer’s Guide》一书
版权所有 © 2001 Addison Wesley Longman, Inc. 本材料只能根据开放出版许可证 v1.0 或更高版本中规定的条款和条件分发(最新版本目前可在 http://www.opencontent .org/openpub/)。
未经版权所有者明确许可,禁止分发本文档的实质性修改版本。
除非事先获得版权所有者的许可,否则禁止以任何标准(纸质)书籍形式分发作品或作品的衍生作品。