├── .gitignore ├── docs ├── vendors │ ├── fonts │ │ └── .gitkeep │ ├── plugins │ │ └── compatible-plugin │ │ │ ├── html5shiv.min.js │ │ │ ├── respond.min.js │ │ │ └── selectivizr.min.js │ └── libs │ │ └── bootstrap-4.1.3 │ │ └── css │ │ └── bootstrap-reboot.min.css ├── book_of_ruby.pdf ├── images │ ├── author.png │ ├── book-of-ruby.jpg │ ├── chapter19_rails.png │ ├── chapter2_Class.png │ ├── chapter18_debugger.png │ ├── chapter13_debug_recursion.png │ ├── chapter19_blog_test_index.png │ ├── chapter19_blog_test_list.png │ ├── chapter2_Class_Variables.png │ └── chapter19_blog_test_create.png ├── vendor-manifest.json ├── html │ ├── 1-author.html │ ├── category.json │ ├── 0-homepage.html │ ├── 2-introduction.html │ └── 23-appendix.html ├── index.html ├── app.ba0382357b4c97ae1ab2.css └── app.2b571855c9f3fc4e0f3a.js ├── src ├── vendors │ ├── fonts │ │ └── .gitkeep │ ├── plugins │ │ └── compatible-plugin │ │ │ ├── html5shiv.min.js │ │ │ ├── respond.min.js │ │ │ └── selectivizr.min.js │ └── libs │ │ └── bootstrap-4.1.3 │ │ └── css │ │ └── bootstrap-reboot.min.css ├── app.js ├── components │ ├── line-numbers.js │ ├── navigation.js │ └── category.js ├── utils │ ├── controller.js │ ├── github-gist.css │ └── base.scss ├── app.html └── app.scss ├── config ├── path.config.js ├── webpack.dll.config.js └── webpack.config.js ├── markdown ├── 1-author.md ├── 0-homepage.md ├── 2-introduction.md ├── 13-chapter11.md ├── 23-appendix.md ├── 17-chapter15.md ├── 16-chapter14.md ├── 5-chapter3.md ├── 3-chapter1.md ├── 15-chapter13.md ├── 7-chapter5.md └── 11-chapter9.md ├── .eslintrc.json ├── index.js ├── package.json ├── README.md └── md_2_html.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /docs/vendors/fonts/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/vendors/fonts/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/book_of_ruby.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang1212/the-book-of-ruby/HEAD/docs/book_of_ruby.pdf -------------------------------------------------------------------------------- /docs/images/author.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang1212/the-book-of-ruby/HEAD/docs/images/author.png -------------------------------------------------------------------------------- /docs/images/book-of-ruby.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang1212/the-book-of-ruby/HEAD/docs/images/book-of-ruby.jpg -------------------------------------------------------------------------------- /docs/images/chapter19_rails.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang1212/the-book-of-ruby/HEAD/docs/images/chapter19_rails.png -------------------------------------------------------------------------------- /docs/images/chapter2_Class.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang1212/the-book-of-ruby/HEAD/docs/images/chapter2_Class.png -------------------------------------------------------------------------------- /docs/images/chapter18_debugger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang1212/the-book-of-ruby/HEAD/docs/images/chapter18_debugger.png -------------------------------------------------------------------------------- /docs/images/chapter13_debug_recursion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang1212/the-book-of-ruby/HEAD/docs/images/chapter13_debug_recursion.png -------------------------------------------------------------------------------- /docs/images/chapter19_blog_test_index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang1212/the-book-of-ruby/HEAD/docs/images/chapter19_blog_test_index.png -------------------------------------------------------------------------------- /docs/images/chapter19_blog_test_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang1212/the-book-of-ruby/HEAD/docs/images/chapter19_blog_test_list.png -------------------------------------------------------------------------------- /docs/images/chapter2_Class_Variables.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang1212/the-book-of-ruby/HEAD/docs/images/chapter2_Class_Variables.png -------------------------------------------------------------------------------- /docs/images/chapter19_blog_test_create.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang1212/the-book-of-ruby/HEAD/docs/images/chapter19_blog_test_create.png -------------------------------------------------------------------------------- /docs/vendor-manifest.json: -------------------------------------------------------------------------------- 1 | {"name":"vendor_lib_00ccb2ec0d3f53b1e34d","content":{"./node_modules/lodash/lodash.js":{"id":1,"buildMeta":{"providedExports":true}},"./node_modules/webpack/buildin/global.js":{"id":2,"buildMeta":{"providedExports":true}},"./node_modules/webpack/buildin/module.js":{"id":3,"buildMeta":{"providedExports":true}}}} -------------------------------------------------------------------------------- /config/path.config.js: -------------------------------------------------------------------------------- 1 | /*! Path config */ 2 | 3 | const NODE_ENV = process.env.NODE_ENV || 'production'; 4 | 5 | const SRC_DIR = './src/', 6 | DIST_DIR = require('path').resolve(__dirname, '../docs/'); 7 | 8 | module.exports = { 9 | dev: !(NODE_ENV === 'production'), 10 | map: !(NODE_ENV === 'production'), 11 | 12 | src : SRC_DIR, 13 | dist: DIST_DIR 14 | }; -------------------------------------------------------------------------------- /src/app.js: -------------------------------------------------------------------------------- 1 | /* App entry file */ 2 | 3 | import './app.scss'; 4 | 5 | import controller from 'utils/controller.js'; 6 | 7 | import { generate_category, auto_active_nav, add_header, add_footer } from 'components/category.js'; 8 | import { insert_line_num } from 'components/line-numbers.js'; 9 | import { generate_navigation } from 'components/navigation.js'; 10 | 11 | 12 | generate_category(); 13 | 14 | controller([ 15 | () => (document.body.scrollTop = 0) || (document.documentElement.scrollTop = 0), 16 | auto_active_nav, 17 | add_header, 18 | add_footer, 19 | insert_line_num, 20 | generate_navigation 21 | ]); -------------------------------------------------------------------------------- /src/components/line-numbers.js: -------------------------------------------------------------------------------- 1 | /* code line-numbers */ 2 | 3 | function insert_line_num() { 4 | 5 | document.querySelectorAll('.file-content pre > code').forEach(ele => { 6 | const style_obj = getComputedStyle(ele), 7 | _height = +style_obj.height.match(/[\d.]+/), 8 | _lh = +style_obj.lineHeight.match(/[\d.]+/); 9 | 10 | let _num = Math.ceil(_height / _lh), 11 | line_number = []; 12 | 13 | while (_num--) { 14 | line_number.push(_num + 1 + '\n'); 15 | } 16 | 17 | ele.setAttribute('line-number', line_number.reverse().join(' ')); 18 | }); 19 | 20 | } 21 | 22 | export { 23 | insert_line_num 24 | }; 25 | 26 | export default insert_line_num; -------------------------------------------------------------------------------- /docs/html/1-author.html: -------------------------------------------------------------------------------- 1 |
5 | Huw Collingbourne 是 SapphireSteel 软件 (http://www.sapphiresteel.com/) 的技术总监,同时也是基于 Visual Studio 的 'Ruby In Steel' Ruby 和 Rails 集成开发环境(IDE)以及基于 Adobe Flex 的 'Amethyst' 集成开发环境的开发人员。Huw 还是英国著名的技术作家,在一些计算机杂志上,例如 Computer Shopper、PC Pro and PC Plus,撰写了许多有关 C#、Delphi、Java、Smalltalk 以及 Ruby 的评论和编程专栏。另外,他也是免费的电子书《The Little Book Of Ruby》的作者,以及在线计算杂志 Bitwise (www.bitwisemag.com) 的编辑。Huw 拥有剑桥大学的英语硕士学位。
8 | -------------------------------------------------------------------------------- /markdown/1-author.md: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | { 4 | "title": "关于作者", 5 | "ctime": "2016-11-03 19:00:00", 6 | "mtime": "2016-11-03 19:00:00" 7 | } 8 | 9 | --- 10 | 11 | # 关于作者 12 | 13 | *** 14 | 15 |
17 |
17 |
93 | 《The Book Of Ruby》由 SapphireSteel 软件赞助,并提供开发了 Ruby In Steel IDE for Visual Studio 。
94 | http://www.sapphiresteel.com
95 |

随着开源社区的兴盛,作为一名开发者,我们在日常工作和生活中接触的开源技术也越来越多,未来开源已成为趋势和潮流。其中,开源书籍也成为了提供给我们开发者学习的免费并且宝贵的资源。在此之前,很多开发者都将自己所感兴趣领域的开源书籍、文档翻译成了中文,分享给国内的开发者参考学习,这似乎也算是对开源社区的一部分贡献吧。
9 |《The Book Of Ruby》是一本与 Ruby 语言 编程知识相关的开源书籍,市面上有这本书的纸质出版书(英文版),而且 Windows 平台下安装了 Ruby 语言之后,这本书的 pdf 文件(英文版)也会随 API 文档存放于 Ruby 根目录的 doc/ 目录下(目前发现,在安装 Ruby 2.3 还是 2.4 版本之后不再附带该 pdf 文档)。
我与 Ruby 结缘也算是一种巧合,源于一个网络游戏。事实上之前我非常喜欢玩《梦幻西游》这款网易公司出品的经典网游,但是随着自己慢慢长大,尤其是进入大学之后,学业上的事情比较繁重,就没有精力再继续玩下去了。然而,《梦幻西游》是一代人的回忆,也是我青春中的一段美好经历,10 年后它依然在,玩家已经换了一批又一批,它也早都不是当年的模样了。
11 |在我读高中期间,偶尔闲暇的时候会上网搜索一下有关《梦幻西游》的信息,一次偶然间发现了民间单机版梦幻西游,下载下来后感觉还不错,而且民间制作单机版网游的人还不少。后来在大学期间,又接触了一批新的梦幻西游单机游戏,这次明显比高中时候接触的那些质量要好得多。这一次,激发我的探索欲,我接触到了 66rpg 论坛和 RPG Maker XP 游戏制作工具,后来也尝试着自己修改 RPG Maker XP 的脚本代码,而这些脚本代码正是由 Ruby 编写的。
12 |Ruby 可以说是除过大学课程里面的 C 语言以外,我接触到并且用来写了大量代码的第一个高级语言,当然后来我也喜欢上了这门语言。Ruby 是一门纯粹的面向对象的脚本语言,可能它的运行效率会慢一点,但它的开发效率是极高的(Ruby 时代提倡敏捷开发)。更重要的是,它的面向对象的编程思想和设计哲学非常值得热爱编程的开发者去学习和借鉴。
13 |Ruby 在前几年因为 ROR(Ruby on Rails)在 Web 开发方面大放异彩,事实上 GitHub 平台就是基于 ROR 构建的。遗憾的是,Ruby 在国内一直不温不火,据说在国外还是比较火的,虽然 ROR 框架现在用的少了,但 Ruby 语言在很多方面还是能看到它的踪影的,例如前端 Sass 工具就是用 Ruby 写的。Ruby 的创造者是一名日本人,也是首个亚洲人创造的编程语言,可能是由于偏见以及诸多原因,让 Ruby 没能成为一门主流语言。但是,Ruby 是一个集合了诸多早期其它编程语言(Perl、Smalltalk、Lisp 等)优点的高级语言,其中的设计哲学有很多地方值得我们去学习和体会。
14 |国内的大多数开发者也许还不了解 Ruby,据说用过 Ruby 的人大多数认为它是对程序员友好的,同时我个人也觉得官方的 API 文档做的也是非常的好,而且从 Ruby 中领略到的面向对象的思维以及元编程的技巧是对开发者充满诱惑的,所以我推荐大家去学习 Ruby,它也许是一个很不错的工具。
15 |在国内 Ruby 的学习资料是稀缺的,事实上 Ruby 相比其它语言(Java、PHP、C++ 等)的英文学习资料也是很少的,但这并不代表人们不认可它,近些年来 Ruby 在全球编程语言排名中一直位居 10 位左右,表现还不错。《The Book Of Ruby》这本书的最新版出版时间距今(2016年)已经约有六、七年了,但它的参考价值仍然是巨大的,全书共二十章,400 多页。该书不是简单的讨论了 Ruby 的语法,而是作者(Huw Collingbourne)带领你步步深入到 Ruby 之中,了解它的核心思想。
16 |因此,我打算将这本书翻译成中文版,一方面是给自己找个事情做,能从中了解到更多编程思想和设计哲学,也方便以后自己去查阅,毕竟中文对我来说还是阅览速度更快的;另一方面呢,将该项目放到 GitHub 平台上,如果国内有 Ruby 的开发者感兴趣可以作为参考,这也算是为开源社区做一点点贡献吧。
17 |全书共 20 章节,下面是每一章节的内容概要:
19 |最后,我向大家推荐一些有关 Ruby 的学习资料。
43 |正因为你现在在阅读一本关于 Ruby 的书,我认为你不需要我去利用 Ruby 语言的优点说服你接受它这个假设是完全成立的。所以,我将采取特别的方式开始,需要注意的是:许多人被 Ruby 吸引是因为其简单的语法和易用性。然而,他们错了。Ruby 的语法一眼看去很简单,但是当你对它了解得越来越多时你会意识到,相反地,它是非常复杂的。事实就是,对于不熟悉 Ruby 的程序员来说却有很多陷阱。
5 |在这本书中,我的目标是引导你摆脱这些陷阱,带领你穿越 Ruby 的语法和类库的浪潮。在探索的过程中会经历平坦的高速路以及有些曲折颠簸的小路。在旅途结束时,你应该能够安全、有效的使用 Ruby 了,而不会被沿途的任何意外所绊倒。
6 |本书中使用的 Ruby 版本主要集中于 1.8.x 版本。虽然 Ruby 的 1.9 版本可能已经发布了,但 1.8 版本的 Ruby 仍然远远没有被广泛的使用。Ruby 的 1.9 版本可能被视为 2.0 版本的铺垫。大多数人同意 Ruby 1.9 版本的语法接近 1.8 版本,但你应该注意其中的一些差异,完全兼容是不可能的。
7 |8 |10 |译注:目前(2016年11月)Ruby 的版本已经更新到 2.4(开发版),而稳定版为 2.3.x 。
9 |
这本书被分成了多个小部分。每一章都会介绍一个主题,而此又细分为多个子话题。并且,每个编程主题中都会伴随一个或多个彼此独立,直接就能运行的 Ruby 程序。
12 |如果你想跟随一个结构良好的教程学习,那就按顺序阅读每个章节。如果你更喜欢学习到实用的方法,你也可以先运行程序,在你需要解释说明的时候再去参考文本。当然,如果你已经有了一些 Ruby 的实践经验,你可以按任意的顺序选择你觉得对你有用的章节进行阅读。在本书中没有大篇幅的相关联的应用程序代码或主题讨论,所以你不必担心由于没有按顺序阅读而导致你错过了一些重点。
13 |除了第一章,每一章都有一个部分叫做“深入探索”。在这部分我们将更深入地探索 Ruby 更具体的某些方面(包括一些我刚才提到的可能历经的曲折)。在大多数情况下,你可以直接跳过深入探索这部分,继续学习你今后必须要用到的知识。另一方面来说的话,在深入探索这一部分我们经常会接触到关于 Ruby 内部运作机制的知识,所以,如果你跳过这部分可能会错过一些非常有趣的东西。
15 |在这本书中,任何 Ruby 源代码都是像下面这样写的:
17 |def saysomething
18 | puts("Hello")
19 | end当有一个示例程序伴随代码时,程序名将显示在页面右侧的一个框中,像这样:
20 |说明注释(通常是为在文本中提到的一些要点提供一些提示或给予一个更深入的解释)显示在这样一个方框中:
23 |Ruby 是一种跨平台解释型语言,它具有许多与其他“脚本”语言(如 Perl 和 Python )相同的特性。第一眼看上去它具有类似 Pascal 风格的英语语法。它是完全面向对象(object oriented)的,并且与著名的纯 OO 语言的鼻祖 Smalltalk 语言有很多共同点。据说,对 Ruby 语言的开发具有影响力的语言有:Perl、Smalltalk、Eiffel、Ada 和 Lisp。Ruby 语言是由 Yukihiro Matsumoto (通常称为 “Matz”,译注:日籍,中文译名为松本行弘)开发创造的,并于 1995 年首次发布。
29 |目前,围绕 Ruby 最高的热度可以归功于一个 Web 开发框架,Rails —— 通常称为 “Ruby On Rails” 。Rails 是一个令人印象深刻的框架,但它并不代表 Ruby 的全部。事实上,你在没有首先精通 Ruby 的情况下直接去接触 Rails 开发框架,你可能会发现你最终创建的应用程序(applications),连你自己都不能理解(实际上,这在 Ruby On Rails 新手中太常见了)。学习 Ruby 是理解 Rails 的必要前提条件。
31 |你可以在 http://www.ruby-lang.org 下载最新版本的 Ruby 。确保你下载了二进制文件(不仅仅是源代码)。在 PC 上,你可以使用 Ruby Installer for Windows 安装 Ruby :http://rubyinstaller.rubyforge.org/wiki/wiki.pl 。
33 |或者,如果你使用的是 Ruby In Steel IDE,你可以使用网站的下载页面上提供的 Ruby In Steel “一体化安装程序”安装 Ruby,Rails,Ruby In Steel 和所有其他需要使用的工具:http://www.sapphiresteel.com/ 。
34 |本书每章中的所有程序都可以从 http://www.sapphiresteel.com/The-Book-Of-Ruby 下载 Zip 文件获取。当你解压缩这些程序包之后,你会发现它们是被按章节分到一组目录中的。使用 Ruby In Steel (由本书作者的公司开发的 Visual Studio IDE)的好处就是,你可以将在一个项目树分支中的每个章节的源程序作为一个 Visual Studio solutions 全部加载到 Ruby In Steel For Visual Studio 2008 中。如果你正在使用其它编辑器或者 IDE ,你需要一个一个的加载每个 Ruby 程序。使用 Ruby In Steel for Visual Studio 2005 的用户可以(通过 文件 新建/打开 菜单)导入或者转换该项目。
36 |经常在包含有你的 Ruby 程序的源目录中打开一个命令行窗口是非常有用的。假设 Ruby 解释器(interpreter)在你的系统中路径是正确的,你就可以通过(在命令行)输入 ruby <filename> 来运行你的程序:
38 |ruby 1helloworld.rb如果你使用的是 Ruby In Steel ,你可以在交互式控制台通过按 CTRL+F5 运行你的程序,或者按 F5 调试程序。
39 |这本书涵盖了标准 Ruby 库(Standard Ruby Library)中的许多类和方法,但并不是全部。因此,在某些时候你需要参考 Ruby 所使用的所有类的文档。幸运的是,Ruby 类库包含有被提取编译为易于浏览的多种合适格式的嵌入式文档。例如,请参考被放在 Web 网站上的在线文档:http://www.ruby-doc.org/core/ 。
41 |或者,你也可以按字母顺序浏览:http://www.ruby-doc.org/stdlib/ 。
42 |上面这些页面都包含有如何下载离线文档的说明。还有一个页面,你可以从其中下载多种格式、版本和语言的文档:http://www.ruby-doc.org/downloads 。
43 |OK,这些序言已经足够了,让我们开始吧。是时候直接去阅读第一章了。
44 |
46 | 《The Book Of Ruby》由 SapphireSteel 软件赞助,并提供开发了 Ruby In Steel IDE for Visual Studio 。
47 | http://www.sapphiresteel.com
48 |
`。
79 |
80 | Ruby 认为任何由反引号括起来的都是一个可以使用 `print` 或 `puts` 方法传递给操作系统执行的命令。到目前为止,你可能已经猜到 Ruby 提供了不仅仅一种方式去实现这些。事实证明,`%x/some command/` 与 `somecommand` 具有相同的效果,当然 `%x{some command}` 也是如此。例如,在 Windows 操作系统上,如下所示的三行代码都是将命令 **dir** 传递给操作系统执行,显示目录列表:
81 |
82 | 关于逗号
112 |113 | 你有时可能会看到 Ruby 代码使用逗号分割来分割字符串或者其它类型数据。在某些情况下,这些逗号似乎有连接字符串的效果。例如,下面的代码一眼看上去似乎是创建和显示了一个由三个子字符串加整数组成的字符串: 114 |
115 | 116 | s4 = "This ", "is", " not a string!", 10 117 | print("print (s4):", s4, "\n") 118 | 119 |120 | 事实上,用逗号分割的列表是创建了一个数组——一个基于字符串的有序列表。string_concat.rb 程序包含的示例证明了这一点。 121 |
122 |
123 | 请注意,当你将一个数组传递给一个方法比如puts,数组中的每个元素将被单独处理。你可以像下面一样将x传递给puts:
124 |
在这种情况下,输出将会是:
129 | 130 | This 131 | is 132 | not a string! 133 | 10 134 | 135 |我们将在下一章中更深入的研究数组。
136 |记录分隔符- $/
204 |
205 | Ruby 预定义了一个变量 $/ 来作为“记录分隔符”。这个变量被用于一些方法中,例如 gets 和 chomp 中。gets 方法读入一个字符串时将会包含一个记录分隔符。chomp 方法将会返回一个字符串,该字符串末尾存在记录分隔符时删除后返回,不存在时直接返回未修改的原始字符串。如果你愿意,可以重新定义记录分隔符,如下所示:
206 |
myvar 的变量和名为 myVar 的变量是不同的。一个和示例程序中 name 一样的变量,它的名字必须以小写字母开头(如果以大写字母开头,Ruby 会认为它是一个常量(constant),关于常量在后面的章节我会详细说明。)
41 | class),但是有三个 cat 对象(objects):tiddles、cuddles 和 flossy。一个方法(method)就像一个定义在类中的函数或子例程。
177 | 糟糕!这个程序似乎包含一个错误。
259 |
260 | 名为 someotherdog 的对象从未给它的 @name 变量赋值。幸运的是,在我们要显示这只狗的名字时 Ruby 并不会发生错误,而只会打印“nil”。我们将很快看到一个简单的方式来确保这样的错误不再发生...
261 |
什么是自由独立的代码?
272 |
273 | 如果 Ruby 真的是一个面向对象的语言,你可能会因为我们可以写“自由浮动”的方法而感到奇怪。事实上被证明的是,当你运行一个程序时,Ruby 会创建一个 main 对象并且任何出现在其内部的代码不是自由浮动的,实际上是在 main 对象内部运行。你可以很容易的验证这一点,创建一个新的源文件,添加这些代码然后运行它来查看输出信息:
274 |
p方法作为打印和查看对象细节的快捷语法,像这样:
325 |
326 | 什么是递归(Recursion)?
160 | 161 | 简单的说,递归方法就是调用它自己的。如果你不熟悉递归编程,请参阅本章末尾的“深入探索”部分中的“简单递归”。 162 |
335 |
336 | 此屏幕截图显示了在 Ruby In Steel 中调试的递归程序。我可以单步执行源代码,使用调用堆栈来跟踪当前递归的“级别”(调用 addup 方法的次数),并使用Watch 窗口监视变量的当前值。
337 |
RDoc 是描述源代码文档格式的工具。RDoc 工具是 Ruby 的标准工具,可以处理 Ruby 代码文件和 C 代码 Ruby 类库,以便提取文档并对其进行格式化,以便它可以显示,例如在 Web 浏览器中。可以以源代码注释的形式显式添加 RDoc 文档。RDoc 工具还可以提取源代码本身的元素,以提供类,模块和方法的名称以及方法所需的任何参数的名称。
5 |以 RDoc 处理器可访问的方式记录你自己的代码很容易。你可以在记录代码之前编写一组普通的单行注释(例如类或方法),也可以编写由 =begin rdoc 和 =end 分隔的嵌入式多行注释。请注意,rdoc 必须跟随 =begin 后,否则 RDoc 处理器将忽略注释块。
如果要生成文档,只需从命令提示符运行 RDoc 处理器即可。要为单个文件生成文档,请输入 rdoc,后跟文件名:
rdoc rdoc1.rb要为多个文件生成文档,请在 rdoc 命令后输入以空格分隔的文件名:
rdoc rdoc1.rb rdoc2.rb rdoc3.rbRdoc 工具将创建一个格式良好的 HTML 文件(index.html),顶部有三个窗格,底部有四个较大的窗格。三个顶部窗格显示文件,类和方法的名称,而底部窗格显示文档。
9 |HTML 包含超链接,以便你可以单击类和方法名称以导航到关联的文档。文档放在它自己的子目录 \doc 中,还有许多必需的 HTML 文件和一个样式表来应用格式。
10 |你可以通过在单个单词或多个单词周围的标签周围放置格式字符来为 RDoc 注释添加额外的格式。使用 * 和 * 表示粗体,_ 和 _ 表示斜体,+ 和 + 表示'打字机'字体。较长文本的等效标记为 <b> 和 </b> 表示粗体,<em> 和 </em> 表示斜体,<tt> 和 </tt> 表示打字机字体。
如果要从 RDoc 文档中排除注释或注释的一部分,可以将它放在 #-- 和 #++ 注释标记之间,如下所示:
#--
13 | # This comment won‟t appear
14 | # in the documentation
15 | #++
16 | # But this one will还有各种特殊说明,包含在冒号对之间。例如,如果要添加要在浏览器栏中显示的标题,请使用 :title:,像这样:
#:title: My Fabulous RDoc DocumentRDoc 提供了更多选项,使你能够以各种方式格式化文档,并以其它格式输出来替代 HTML 格式。如果你真的想要掌握 RDoc,请务必阅读完整的文档:
18 |http://rdoc.sourceforge.net/doc/index.html
19 |如果你正在使用 Rails,则需要安装数据库。虽然有很多可能的选择,但最广泛使用的是 MySQL。如果你之前从未使用过 MySQL,你可能会发现一些设置选项令人困惑。在这里,我将尝试引导你完成整个过程,以避免潜在的问题。
21 |本指南基于 Windows 下的 MySQL 5.0 安装。在其它操作系统上安装其它版本时可能会有所不同。有关其它指南,请参阅 MySQL 站点。
24 |MySQL 主站点位于 http://www.mysql.com/,你可以从此处导航到当前版本的下载页面。
27 |我假设你将使用 MySQL 的免费版本。可以从 http://dev.mysql.com/downloads 下载。在撰写本文时,当前版本是 MySQL 5 Community Server。当然,名称和版本号会随着时间的推移而变化。下载当前(即将发布的,alpha 或 beta)版本。选择为你的操作系统推荐的特定版本(例如,Win32 和 Win64 可能有不同的版本)。
29 |你需要在此页面的某处向下滚动以找到适用于你的操作系统的安装程序。对于 Windows,你可以下载完整的 MySQL 包或较小的 Windows Essentials 包。完整的包包含数据库开发人员的额外工具,但这些不是简单的 Rails 开发所必需的。因此,对于大多数人来说,可以获得较小的 Windows Essentials 下载文件。
30 |你应该单击此选项旁边的“选择镜像”(Pick A Mirror)链接。然后,你将看到一份问卷,如果你愿意,可以填写。如果你不希望这样做,只需向下滚动页面并选择一个区域下载站点。单击一个链接并保存文件,其名称类似(数字可能不同):mysql-essential-5.0.41-win32.msi,磁盘上任意合适的目录。
31 |下载完成后,通过在下载对话框中选择“打开”(Open)或“运行”(Run)(如果仍然可见)或通过 Windows 资源管理器双击安装文件来运行程序。
33 |注意:在安装 MySQL 期间,可能会在屏幕上出现一些广告。单击按钮以浏览这些。某些安全警告还可能会提示你验证是否有意安装该软件。出现提示时,应单击必要的选项以继续安装。
36 |现在将出现安装向导的第一页。 单击“下一步”(Next)按钮。如果你愿意将软件安装到 C:\Program Files\ 下的默认 MySQL 目录中,则可以选择“典型”(Typical)设置选项。但是,如果要安装到其它目录,请选择“自定义”(Custom)。然后单击下一步(Next)。单击“更改”(Change)以更改目录。
39 |准备好继续后,单击“下一步”(Next)。
40 |你将看到屏幕上显示“准备安装程序”。验证目标文件夹是否正确,然后单击“安装”(Install)按钮。
41 |根据 MySQL 的版本,你现在可能会看到显示的一些营销信息,或者可能会提示你创建一个新的 MySQL 帐户,以便你收到更改和更新的消息。这些不是软件安装的重要部分,你可以单击“下一步”(Next)或“跳过”(Skip)按钮继续安装。
42 |现在出现向导已完成对话框。
43 |点击“完成”(Finish)按钮。
44 |事实上,安装并没有结束。对于某些安装程序,会弹出一个新屏幕,欢迎你使用 MySQL 服务器实例配置向导。如果没有发生这种情况,你需要自己加载。在 Windows 上,单击“开始”菜单,然后在程序组中导航到 MySQL-> MySQL Server 5.0(或你使用的任何版本号),然后再运行 MySQL Server Instance Config Wizard。点击下一步。
46 |假设这是你第一次在此计算机上安装 MySQL,你可以选择标准配置(如果你要从旧版本的 MySQL 升级,则需要选择详细配置 - 这超出了此简单设置指南的范围)。点击下一步。在下一个对话框中,保留选中的默认选项(即,安装为 Windows 服务;服务名称 = 'MySQL' 并自动启动 MySQL 服务器)。然后单击下一步。
47 |在下一个屏幕中,选中“修改安全设置”(Modify Security Settings),然后在前两个文本字段中输入相同的密码(你选择的密码)。你将在以后需要此密码,因此请记住它或将其记录在安全的位置。如果你可能需要从另一台计算机访问 MySQL,可以选中“从远程计算机启用 root 访问权限”(Enable root access from remote machines)。然后单击下一步。
48 |注意:默认的 MySQL 用户名是 "root"。密码是你刚输入的密码。以后在创建 Rails 应用程序时,你将需要这两项信息。
51 |下一个屏幕只显示有关即将执行的任务的一些信息。单击“执行”(Execute)按钮。
54 |如果你以前安装或配置了 MySQL,则可能会看到一条错误消息,告诉你跳过安装。你可以单击“重试”(Retry)以查看是否可以绕过此问题。如果没有,请按 Skip 键,然后重新启动 MySQL 配置过程,在出现提示时选择 Reconfigure Instance 和 Standard Instance。
57 |安装完所有内容后,将出现此屏幕。单击完成。
60 |就是这样!
61 |以下是 Ruby 和 Rails 上一些最有用的书籍的简短列表...
63 |Beginning Ruby: From Novice To Professional
66 | by Peter Cooper $39.99
67 | APress: http://www.apress.com
68 | ISBN: 1590597664
69 | 这本书编写得很好,布局合理,解释清楚,代码示例很有用。简而言之,如果你已经拥有一些编程经验并希望获得 Ruby 世界的可访问介绍,那么这本书就是你的最佳选择。
Programming Ruby: The Pragmatic Programmer’s Guide
72 | by Dave Thomas, with Chad Fowler and Andy Hunt $44.95
73 | ISBN: 0-9745140-5-5 (2 nd edition)
74 | ISBN: 9781934356081 (3 rd edition)
75 | Pragmatic: http://www.pragmaticprogrammer.com/titles/ruby/index.html
76 | 有关 Ruby 语言和库的大量(超过 860 页)指南,所谓的“镐书”(pickaxe book)通常被认为是必不可少的 Ruby 参考。但是,阅读起来并不是轻松,(在我看来)它不是学习 Ruby 最好的“第一本书”。尽管如此,你可能迟早会需要它。第二版涵盖Ruby 1.8;第 3 版涵盖了 Ruby 1.9。
The Ruby Way
79 | by Hal Fulton $39.99
80 | Addison-Wesley: http://www.awprofessional.com/ruby
81 | ISBN: 0-672-32884-4
82 | 在介绍部分,作者指出,由于相对缺乏“教程”材料,“你可能不会从这本书中学习 Ruby”。他把它描述为一种“反向引用”。不是按方法或类的名称查找,而是按功能或目的查找。我认为他大大低估了 The Ruby Way 的教程价值。然而,作者假定只你在编程方面相当熟练。
Ruby On Rails Up and Running
85 | by Bruce A. Tate & Curt Hibbs $29.99
86 | O’Reilly: www.oreilly.com
87 | ISBN: 0-596-10132-5
88 | 我更喜欢编程书籍,而不需要太多的华夫饼干。坦率地说,我没有耐心通过 1000 多页的书籍或按照逐步指南来构建应用程序。所以这书吸引了我。在七章中,它涵盖了有关 Rails 的所有重要内容 - 它的设计模式和类;它的脚本和应用程序生成工具;它的模型,视图,控制器和脚手架; 以及使用 Ajax 和单元测试的概述。
Ruby For Rails
91 | by David A. Black $44.95
92 | Manning : www.manning.com/black
93 | ISBN 1-932394-69-9
94 | 虽然本书主要关注 Rails 开发,但在每一步中都深入研究底层 Ruby 代码的内部工作方式。在十七章和不到 500 页的篇幅中,它将带你从第一次看从 Ruby 语言到创建 Rails 模型,控制器,视图,帮助和模板的细节。在此过程中,它解释了很多关于 Ruby 的内容,包括它的数组和散列,类,方法,块和迭代器。简而言之,如果你是 Ruby 新手,但想尽快加快 Rails 的学习速度,那么本书可能就是你所需要的。
Agile Web Development With Rails (3 rd edition)
97 | by Sam Ruby, Dave Thomas and David Heinemeier Hansson $43.95
98 | Pragmatic: http://pragprog.com/titles/rails3/agile-web-development-with-rails-third-edition
99 | ISBN: 9781934356166
100 | 这是关于 Rails “必备”的一本书。有几本 Ruby 编程书籍可能会争夺“必不可少”的主张,但我知道没有任何其它 Rails 书可以与 Agile Web Development 相媲美,因为它可以全面覆盖其主题。'Nuff 说:如果你认真对待 Ruby On Rails,那么买这本书吧!第 3 版涵盖了 Rails 2。
Learn To Program
106 | 第一版 Chris Pine 的书提供了对 Ruby 的简单介绍。
107 | http://pine.fm/LearnToProgram/
Programming Ruby: The Pragmatic Programmer’s Guide
110 | 可能是你读过的最奇怪的编程书 - 连同会说话的狐狸!
111 | http://poignantguide.net/ruby/
The Little Book Of Ruby
114 | 你正在读的这本书的配套书。
115 | http://www.sapphiresteel.com/The-Little-Book-Of-Ruby
有无数的网站致力于 Ruby,Rails 和相关技术。以下是一些开始探索的内容...
120 |Ruby 语言站点
123 | 124 |Ruby 文档站点
126 | 127 |Ruby 类库参考 (在线)
129 | 130 |Ruby 类库参考(下载地址)
132 | 133 |Ruby On Rails 站点
135 | 136 |The Book Of Ruby 作者的博客...
138 | 139 |3rd Rail
145 | http://www.codegear.com/products/3rdrail/
146 | Eclipse 的商业版 Rails-centric 集成开发环境。
Aptana IDE/ RADRails
149 | http://www.aptana.com/
150 | Eclipse 的免费版 Rails-centric 集成开发环境。
Komodo
153 | http://www.activestate.com/
154 | 多语言(Ruby,Python,PHP,Perl,Pcl),跨平台商业集成开发环境。免费版也可用。
NetBeans
157 | http://www.netbeans.org/products/ruby/
158 | NetBeans 的免费 Ruby 集成开发环境。
Ruby In Steel
161 | http://www.sapphiresteel.com/
162 | 适用于 Visual Studio 的商业 Ruby 和 Rails 集成开发环境。免费版也可用。
TextMate
165 | http://www.macromates.com/
166 | Mac OS X 的 Ruby 编辑器。
以下是一些与 Ruby On Rails 一起使用的流行 Web 服务器。
171 |WEBrick
173 | 174 |LightTPD
176 | 177 |Mongrel
179 | 180 |Apache
182 | 183 |MySQL
188 | 189 |SQLite
191 | 192 |PostgreSQL
194 | 195 |SQL Server Express
197 | 198 |在撰写本文时,Ruby 1.8.x 和 1.9.1 的版本都可用,并且将在未来某个日期发布版本 2.0。目前 Ruby 1.8.6 可能是 Ruby 使用最广泛的版本,本书的大部分内容适用于 Ruby 1.8。实际上,尽管 Ruby 1.9 已经发布,但为了支持使用该版本开发的项目,Ruby 1.8.x 仍将是一个重要的 Ruby 平台,包括使用 Ruby On Rails 和其它框架构建的应用程序。其它 Ruby 解释器,编译器和虚拟机也可用或正在开发中。以下是一个简短的网站列表,它将提供有关 Ruby 实现的更多信息(和下载)...
202 |Ruby
204 | “标准” Ruby 实现。
205 | http://www.ruby-lang.org/en/downloads/
JRuby
208 | Ruby For Java。
209 | http://www.headius.com/
Iron Ruby
212 | 微软正在开发的 "Ruby For .NET"。
213 | http://www.ironruby.net/
Rubinius
216 | 用于 Ruby 的编译器/虚拟机(主要用 Ruby 编写)。
217 | http://rubini.us/
Maglev
220 | 快速 Ruby 实现(开发中)。
221 | http://maglev.gemstone.com/
如何编写一个“普通(normal)”的 for 循环...
88 | 89 | 如果你习惯了常规类型的 `for` 循环,你可以随时通过使用 Ruby 中的 `for` 循环迭代范围中的值来实现。例如,这显示了如何使用一个 `for` 循环变量从 1 到 10 计数,并在每次循环过程中显示其值: 90 | 91 | for i in (1..10) do 92 | puts( i ) 93 | end 94 |块参数(Block Parameters)
143 | 144 | 在 Ruby 中,迭代器的主体称为“块”(block),在块顶部的两个竖直线中声明的任何变量都称为“块参数”(block parameters)。在某种程度上,块的工作方式类似于函数(function),块参数的工作方式类似于函数的参数列表(argument list)。`each` 方法运行块(block)内的代码,并将集合(例如数组,`multiarr`)提供的参数传递给块。在上面的示例中,`each` 方法重复地将有四个元素的数组传递给块,并且这四个数组内的元素初始化为四个块参数 `a`,`b`,`c`,`d`。除了迭代集合之外,块还可以用于其它方面。 我将在第 10 章中对块(block)进行更多说明。 145 |确保循环至少执行一次
231 | 232 | 通常 `while` 循环会执行 0 次或多次,因为布尔测试*先于*循环体执行;如果布尔测试在开始时就返回 false,则循环体内的代码永远不会运行。 233 | 234 | 但是,当 `while` 循环属于 `begin` 和 `end` 包裹的代码块类型时,循环将执行 1 次或多次,因为循环体内的代码*先于*布尔表达式执行。 235 |while 循环的行为差异,请运行 2loops.rb。
241 |
242 | 这些示例应该有助于阐明该问题:
243 |
244 | x = 100
245 |
246 | # The code in this loop never runs
247 | while (x < 100) do puts('x < 100') end
248 |
249 | # The code in this loop never runs
250 | puts('x < 100') while (x < 100)
251 |
252 | # But the code in loop runs once
253 | begin puts('x < 100') end while (x < 100)
254 | Each and Yield…
442 | 443 | 那么,当 Enumerable 模块中的方法调用你编写的 `each` 方法时,真正发生了什么?事实证明,Enumerable 方法(`min`,`max`,`collect` 等)给 `each` 方法传递了一个代码块(block)。这段代码期望一次接收一个数据(即来自某种集合的每个元素)。你的 `each` 方法以块参数的形式为其提供该项,例如此处的参数 `i`: 444 | 445 | def each 446 | @items.each{ |i| 447 | yield( i ) 448 | } 449 | end 450 | 451 | 关键字 `yield` 是一个特殊的 Ruby 魔术,它告诉代码运行传递给 `each` 方法的块 - 也就是说,运行 Enumerator 模块的 `min`,`max` 或 `collect` 方法传递的代码块。这意味着这些方法的代码块可以应用于各种不同类型的集合。你所要做的就是,i)在你的类中包含 Enumerable 模块;ii)编写 `each` 方法,确定 Enumerable 方法将使用哪些值。 452 |Exceptions 有一个家族树(家谱)...
71 | 72 | 要理解 `rescue` 子句如何捕获异常,只要记住,在 Ruby 中异常是对象,并且像所有其它对象一样,它们由一个类定义。此外,还有一个明确的“继承链”,就像所有 Ruby 对象都继承自 Object 类一样。 73 |Object 类是所有异常类(exceptions)的最终祖先类。
122 | 123 | 从 Object 类开始,派生出子类 Exception,然后是 StandardError,最后是更具体的异常类型,例如 ZeroDivisionError。如果你愿意,你可以编写一个 `rescue` 子句来处理 Object 类,因为 Object 是所有对象的祖先,这样确实会成功匹配一个异常对象: 124 | 125 | # This is possible... 126 | rescue Object => exc 127 | 128 | 但是,尽可能匹配 Exception 类的相关后代类通常更有用。作为更好的措施,附加一个处理 StandardError 或 Exception 对象的 `rescue` 子句是很有用的,以防止你没考虑到的异常类型被漏掉。你可以运行 `exception_tree.rb` 程序来查看 ZeroDivisionError 异常的家族树(继承链)。 129 |