“笨办法”学Ruby(第3版)

978-7-115-40734-4
作者: 【美】Zed A. Shaw(泽德 A. 肖)
译者: 王巍巍
编辑: 杨海玲

图书目录:

详情

本书是一本Ruby入门书籍,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用。本书结构非常简单,共包括52个习题,其中26个覆盖了输入/输出、变量和函数3个主题,另外26个覆盖了一些比较高级的话题,如条件判断、循环、类和对象、代码测试及项目的实现等。每一章的格式基本相同,以代码习题开始,按照说明编写代码,运行并检查结果,然后再做巩固练习。

图书摘要

PEARSON

“笨办法”学Ruby(第3版)

learn RUBY the HARD WAY THIRD EDITION

[美]Zed A.Shaw 著

王巍巍 译

人民邮电出版社

北京

图书在版编目(CIP)数据

“笨办法”学Ruby:第3版/(美)肖(Shaw,Z.A)著;王巍巍译.--北京:人民邮电出版社,2015.12

书名原文:Learn Ruby the Hard Way,Third Edition

ISBN 978-7-115-40734-4

Ⅰ.①笨… Ⅱ.①肖…②王… Ⅲ.①计算机网络—程序设计 Ⅳ.①TP393.09

中国版本图书馆CIP数据核字(2015)第270985号

内容提要

本书是一本Ruby入门书籍,是《“笨办法”学Python》的姊妹篇。本书适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用。这本书以习题的方式引导读者一步一步学习编程,从简单的打印一直讲到完整项目的实现,让初学者从基础的编程技术入手,最终体验到软件开发的基本过程。

本书结构非常简单,共包括52个习题,其中26个覆盖了输入/输出、变量和函数3个主题,另外26个覆盖了一些比较高级的话题,如条件判断、循环、类和对象、代码测试及项目的实现等。每一章的格式基本相同,以代码习题开始,按照说明编写代码,运行并检查结果,然后再做巩固练习。

◆著 [美]Zed A.Shaw

译 王巍巍

责任编辑 杨海玲

责任印制 张佳莹 焦志炜

◆人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

北京艺辉印刷有限公司印刷

◆开本:800×1000 1/16

印张:17.5

字数:391千字  2015年12月第1版

印数:1-2500册  2015年12月北京第1次印刷

著作权合同登记号 图字:01-2014-8589号

定价:49.00元

读者服务热线:(010)81055410 印装质量热线:(010)81055316

反盗版热线:(010)81055315

版权声明

Authorized translation from the English language edition,entitled Learn Ruby the Hard Way,Third Edition,9780321884992 by Zed A.Shaw,published by Pearson Education,Inc.,publishing as Addison-Wesley,Copyright © 2015 by Pearson Education,Inc.

All rights reserved.No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical,including photocopying,recording or by any information storage retrieval system,without permission from Pearson Education,Inc.

CHINESE SIMPLIFIED language edition published by PEARSON EDUCATION ASIA LTD.and POSTS & TELECOM PRESS Copyright © 2015.

本书中文简体字版由Pearson Education Asia Ltd.授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。

本书封面贴有Pearson Education(培生教育出版集团)激光防伪标签,无标签者不得销售。

版权所有,侵权必究。

译者序

书是《“笨办法”学Python》的姊妹篇。如果你的编程基础为零,正打算通过Ruby学习编程,那么这本书就非常适合你。本书的结构和难度与《“笨办法”学Python》相似,最大的不同是将编程语言由Python换成了Ruby。所以,如果你看过了《“笨办法”学Python》,就没必要看这本书了。

Ruby是一门影响深远且易于入门的编程语言。本书作者是Ruby圈子里的明星人物,他之所以出名,一方面是因为他在开源软件方面的贡献,另一方面是因为他对一些开源项目的尖刻批评。由此可见他是一个典型的水平高、脾气大的人。不过,在写入门书籍的时候,他还是很平易近人的。

作者将“Learn X the Hard Way”(“笨办法”学编程)系列书籍全部直接发布到了网上,通过http://learnrubythehardway.org/可以阅读到本书的大部分内容,只不过是英文版的。截至目前,本书已经发布到了第3版。第1版只是基本的编程入门,第2版重写了若干章节,并加入了面向对象以及Web应用开发等相关的内容,第3版中作者根据学生的反馈,在各章中添加了“常见问题回答”,并再次修订了后面的若干重点章节,进一步加强了面向对象编程的部分。

如果你对本书有些看法,或者有问题要问,欢迎通过新浪微博@王 joel 或者邮件wangweiwei@outlook.com与我联系。

感谢

感谢来自台湾的xdite网友,他曾经翻译过本书的第1版。

感谢人民邮电出版社勤劳而又专业的编辑们对本书的审稿和校对。

译者简介

巍巍是一名受软件和编程的吸引中途转行的软件从业人员。写代码和翻译是他的两大爱好,他还喜欢在网上撰写和翻译一些文章。如果读者对书中的内容有疑问,或者发现了书中的错误,再或者只是想随便聊聊,请通过微博(http://weibo.com/gastlygem)或者电子邮件(wangweiwei@outlook.com)与他联系。

前言

本书的目的是让你起步编程。虽然书名说是用“笨办法”(Hard Way)学习写代码,但其实并非如此。所谓的“笨办法”指的是本书的教学方式,也就是所谓的“指令式”教学。在这个过程中,我会让你完成一系列习题,使你通过重复练习来学到技能,这些习题也是专为重复练习而设计的。对于一无所知的初学者来说,在能理解更复杂的话题之前,这种教授方式效果是很好的。你可以在各种场合看到这种教授方式,从武术到音乐不一而足,甚至在学习基本的数学和阅读技能时也会看到这种教学方式。

这本书通过练习和记忆的方式,教你逐渐掌握 Ruby 的技能,然后由浅入深,让你将这些技能应用到各种问题上。读完本书以后,你将有能力接触更为复杂的编程主题。我喜欢告诉别人,我的这本书能给你一个“编程黑带”。意思就是说,你已经打好了基础,可以真正开始学习编程了。

如果你肯努力,并投入一些时间,学会了这些技能,你将学会如何编写代码。

致谢

首先我要感谢在本书前两版中帮过我的Angela,没有她的话我有可能就不会费工夫完成这本书了。她帮我修订了第1版书稿,而且在我写书的过程中给了我极大的支持。

我还要感谢Rob Sobers,他建议我基于Python的书再做一个Ruby版,并且做了由Python到Ruby的初始转换工作。

我还要感谢Greg Newman为前两版提供的封面设计,Brian Shumate在早期网站设计方面的帮助,以及所有读过前两版并且提出反馈和勘误的读者。

谢谢你们。

“笨办法”更简单

这本书的帮助下,你将通过完成下面这些非常简单的事情来学会一门编程语言,这也是每个程序员的必经之路。

1.从头到尾完成每一个习题。

2.一字不差地录入每一段程序。

3.让程序运行起来。

就是这样了。刚开始这对你来说会非常难,但你需要坚持下去。如果你通读了这本书,每晚花一两个小时做做习题,你就可以为自己读下一本编程书打下良好的基础。通过这本书,你学到的可能不是真正的“编程”技术,但你会学到学习一门编程语言的基本技能。

这本书的目的是教会你编程新手所需的3种最重要的技能:读和写、注重细节以及发现不同。

读和写

很显然,如果你连打字都成问题的话,那你学习编程也会有问题。尤其是,如果你连程序源代码中的那些奇怪字符都打不出来的话,就更别提编程了。如果没有这些基本技能,你将连最基本的软件工作原理都难以学会。

手动录入代码范例并让它们运行起来的过程,会让你知道各种符号的名称,熟悉它们的用处,最终读懂这门编程语言。

注重细节

区分好程序员和差程序员的最重要的一个方面就是对于细节的重视程度。事实上,这是任何行业区分好坏的标准。如果缺乏对工作中每一个微小细节的注意,你的工作成果将不可避免地出现各种关键缺陷。从编程这一行来讲,你得到的结果将会是毛病多多而且难以使用的软件。

通读这本书并一字不差地录入书中的每个例子,会训练你把精力集中到正在做的事情的细节上。

发现不同

程序员长年累月的工作会培养出一种重要的技能,那就是观察事物间不同点的能力。有经验的程序员拿着两份仅有细微不同的程序,立即就可以指出里边的不同点来。程序员甚至制造出工具来让这件事更加容易,不过我们不会用到这些工具。你要先用笨办法训练自己,然后才可以使用这些工具。

在做这些习题并且录入代码的时候,你一定会写错东西,这是不可避免的,即使有经验的程序员也会偶尔出错。你的任务是把自己写的东西和正确答案对比,把所有的不同点都修正过来。这样的过程可以让你对程序里的错误、bug以及其他问题更加敏感。

不要复制粘贴

你必须手动将每个习题录进去。复制粘贴会让这些习题变得毫无意义。这些习题的目的是训练你的双手、大脑和思维,让你有能力读代码、写代码和观察代码。如果你复制粘贴的话,就是在欺骗自己,而且这些习题的效果也会大打折扣。

使用附带的视频

本书附带了5小时以上的视频教程 [1],用来帮助你学完这本书。每个习题都有一个对应的视频,其中要么是对于习题的演示,要么是教你一些完成习题的小技巧。使用视频最好的方法就是,当你在书里边遇到困难或者完成习题后复习时去看看。这样会让你逐渐摆脱对视频教程的依赖,并培养出直接通过书籍学习的能力。只要坚持这样做,慢慢你就不需要视频教程了,不管是本书的视频还是别的视频,学编程时你都不需要了。你会具备直接通过阅读获取信息的能力。

关于坚持练习的一点提示

你通过这本书学编程时,我正在学弹吉他。我每天至少训练2小时,至少花1小时练习音阶、和弦、琶音,剩下的时间用来学习音乐理论和乐曲演奏、训练听力等。有时我一天会花 8小时来学习吉他和音乐,因为我觉得这是一件有趣的事情。对我来说,要学习一样东西,最自然、最根本的方法就是去反复地练习。我知道,要学好一种技能,每日的练习是必不可少的,就算哪天的练习没啥进展(对我来说是常事),或者说学习内容实在太难,你也不必介意。只要坚持尝试,总有一天困难会变得容易,枯燥也会变得有趣。

在我写《“笨办法”学 Python》和《“笨办法”学 Ruby》这两本书之间的时间内,我对绘画产生了兴趣。在39岁的时候喜欢上了视觉艺术,然后就跟以前学习吉他、音乐、编程的时候一样,每天学习绘画。我搜集了诸多入门教材,照着书上的去做,每天都画一些东西出来,并且享受着学习的过程。我离“艺术家”还差得远,甚至连“画得好”都谈不上,不过现在我可以说我是“会画画”的了。在学习艺术的过程中,我用的就是这本书教编程的方法。只要将问题拆分成小的练习和课程,你就可以学会任何东西。只要集中精力慢慢提高,享受学习的过程,不管最终学到什么程度,你都会从中获益的。

通过这本书学习编程的过程中要记住一点,就是所谓的“万事开头难”,对于有价值的事情尤其如此。也许你是一个害怕失败的人,一遇到困难就想放弃;也许你是一直没学会自律,一遇到“无聊”的事情就不想上手;也许因为有人夸你“有天分”而让你自视甚高,不愿意做这些看上去很笨拙的事情,怕有负你“天才”的称号;也许你太过激进,把自己跟像我这样有20多年经验的编程老手相比,让自己失去了信心。

不管是什么原因,你一定要坚持下去。如果遇到做不出来的巩固练习,或者遇到一个看不懂的习题,你可以暂时跳过去,过一阵子回来再看。编程中有一件经常发生的怪事就是,一开始你什么都不懂,这会让你感觉很不舒服,就像学习人类的语言一样,你会发现很难记住一些词和特殊符号的用法,而且会经常感到很迷茫,直到有一天,你会觉得豁然开朗,以前不明白的东西忽然就明白了。如果你坚持完成并努力理解这些习题,你最终会学会这些东西的。也许你不会成为一位编程大师,但你至少会明白编程的原理。

如果你放弃的话,你会失去达到这个程度的机会。如果你坚持尝试,坚持录入习题,坚持弄懂习题的话,你最终一定会明白里边的内容的。如果你通读了这本书,却还是不懂怎样写代码,你的努力也不会白费。你可以说你已经尽力了,虽然成效不佳,至少你尝试过了。这也是一件值得骄傲的事情。

给“小聪明”们的警告

有些学过编程的人读到这本书可能会有一种被贬低的感觉。其实本书没有任何要居高临下地贬低任何人的意思,只不过我比我面向的读者群知道的更多而已。如果你觉得自己比我聪明,觉得我在居高临下,那我也没办法,因为你根本就不是我的目标读者。

如果你觉得这本书里到处都在贬低你的智商,那我对你有以下3个建议。

1.别读这本书了。我这本书不是写给你的,而是写给那些不是什么都懂的人看的。

2.放下架子好好学。如果你认为你什么都懂,那就很难从比自己强的人身上学到什么了。

3.学Lisp去。我听说什么都懂的人特喜欢Lisp。

对于其他抱着学习的目的而来的人,你们读的时候就想着我在微笑就可以了,而且我的眼睛里还带点儿恶作剧的闪光。

[1].本书附带视频请在www.epubit.com.cn的本书页面上下载。

习题0 准备工作

个习题并没有代码,它的主要目的是让你在计算机上安装好 Ruby。你应该尽量照着说明进行操作,例如,Mac OS X已经安装了Ruby 2,所以就不要在上面安装别的Ruby版本了。警告 如果你不知道怎样使用Windows下的PowerShell、OS X下的Terminal或者Linux下的bash,那你就需要先学会一个。你应该先完成附录中的习题后,再回来继续下面这些习题。

Mac OS X

完成这个习题需要完成下列任务。

1.用浏览器打开 http://www.barebones.com/products/textwrangler/,找到并安装TextWrangler文本编辑器。

2.把TextWrangler(也就是你的编辑器)放到dock中,以方便日后使用。

3.找到系统中的Terminal程序。到处找找,你会找到的。

4.把Terminal也放到dock里面。

5.运行Terminal程序,这个程序没什么好看的。

6.在Terminal里运行ruby –v,看看Ruby的版本。

7.如果你使用的ruby版本小于2.0,那么你的Ruby版本就太老了。这时你有3个选择。

a.升级OS X到最新版本,现在OS X是免费的,所以你也找不到借口不升级了。

b.到https://www.ruby-lang.org/en/downloads/这个网址,用那里提供的安装包安装一下。

c.找个朋友帮你安装一下Ruby 2.x或者更高的版本。

8.这样你就应该退回到敲ruby –v前的提示界面了。如果没有的话,自己研究一下为什么。

9.学着在Terminal上创建一个目录。

10.学着在Terminal上变到一个目录。

11.使用你的编辑器在你进入的目录下创建一个文件。建立一个文件,使用“保存”(Save)或者“另存为”(Save As...)选项,然后选择这个目录。

12.使用键盘切换回到Terminal窗口。

13.回到Terminal,列出该目录,查看你新建的文件。

OS X:应该看到的结果

下面是我在自己的OS X计算机的Terminal中完成上述步骤时看到的内容,和你做的结果可能会有一些不同,但应该是非常类似的。

Last login: Sat Apr 24 00:56:54 on ttys001

~ $ ruby -v

ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin11.0]

~ $ mkdir mystuff

~ $ cd mystuff

mystuff $ ls

# ...Use TextWrangler here to edit test.txt ...

mystuff $ ls

test.txt

mystuff $

Windows

1.用浏览器打开http://notepad-plus-plus.org,找到并安装Notepad++文本编辑器。完成这个操作无需管理员权限。

2.把Notepad++放到桌面或者快速启动栏,这样就可以方便地访问该程序了。这两个选项在安装过程中可以看到。

3.从“开始”(Start)菜单运行PowerShell。你可以使用“开始”菜单的搜索功能,输入名称找到它,并且敲回车键即可运行。

4.为它创建一个快捷方式,放到桌面或者快速启动栏中,以方便使用。

5.运行PowerShell程序(也就是后面所说的终端),这个程序没什么好看的。

6.在PowerShell程序中运行ruby -v。运行的方法是输入命令名再敲一下回车键。

a.如果运行 ruby 发现它不存在(ruby is not recognized..),你需要访问http://rubyinstaller.org/或者http://ruby.org/download下载并且安装Ruby。

b.确认你要安装的是Ruby 2.0或者Ruby 2.1,而不是Ruby 1.8或者Ruby 1.9。

c.关闭并重启PowerShell,确认 Ruby现在可以运行。如果不行的话,可能需要重启计算机。

d.你应该会看到ruby –v输出版本号是2.1或者2.0,而非1.9或者1.8。

7.这样你就应该退回到敲ruby前的提示界面了。如果没有的话,自己研究一下为什么。

8.学着在PowerShell上创建一个目录。

9.学着在PowerShell上变到一个目录。

10.使用你的编辑器在你进入的目录下创建一个文件。建立一个文件,使用“保存”(Save)或者“另存为”(Save As...)选项,然后选择这个目录。

11.使用键盘切换回到PowerShell窗口。如果不知道怎样使用键盘切换,你可以自己查一下。

12.回到PowerShell,列出该目录,查看你新建的文件。

从现在开始,当我说“终端”或者“shell”的时候,我指的就是 PowerShell,这也是你应该使用的东西。

Windows:应该看到的结果

> ruby -v

ruby 2.1.2p95 (2014-05-08 revision 45877)

> mkdir mystuff

> cd mystuff

...Here you would use Notepad++ to make test.txt in mystuff ...

>

> dir

Volume in drive C is

Volume Serial Number is 085C-7E02

Directory of C:\Documents and Settings\you\mystuff

04.05.2010 23:32  <DIR>     .

04.05.2010 23:32  <DIR>     ..

04.05.2010 23:32        6 test.txt

1 File(s)      6 bytes

2 Dir(s) 14 804 623 360 bytes free

>

你看到的信息和我看到的不一样也没关系,大体上应该是相似的。

Linux

Linux 系统可谓五花八门,安装软件的方式也各有不同。既然你是 Linux 用户,我就假设你已经知道如何安装软件包了,以下是操作说明。

1.使用你的Linux软件包管理器并安装gedit文本编辑器。

2.把gedit(也就是你的编辑器)放到窗口管理器容易见到的位置,以方便日后使用。

a.运行gedit,先改掉一些愚蠢的默认设置。

b.从gedit菜单中打开Preferences,选择Editor选项卡。

c.将选项卡的width:改为4。

d.选择(确认已勾选该选项)Insert spaces instead of tabs。

e.然后打开Automatic indentation选项。

f.转到View选项卡,打开Display line numbers选项。

3.找到终端程序。它的名字可能是GNOME Terminal、Konsole或者xterm。

4.把终端也放到你的dock里面。

5.运行终端程序。这个程序没什么好看的。

6.在终端程序中运行ruby -v。运行的方法是输入命令名再敲一下回车键。(如果运行ruby -v发现它不存在,就需要安装它。确认你要安装的是Ruby 2.0或者Ruby 2.1,而不是Ruby 1.8或者Ruby 1.9。)

7.键入quit()然后按回车键退出Ruby。

8.这样你就应该退回到敲ruby -v前的提示界面了。如果没有的话,自己研究一下为什么。

9.学着在终端上创建一个目录。

10.学着在终端上变到一个目录。

11.使用你的编辑器在你进入的目录下创建一个文件。建立一个文件,使用“保存”(Save)或者“另存为”(Save As...)选项,然后选择这个目录。

12.使用键盘切换回到终端窗口,如果不知道怎样使用键盘切换,你可以自己查一下。

13.回到终端,列出该目录,查看你新建的文件。

Linux:应该看到的结果

$ ruby

ruby 2.1.2p95 (2014-05-08 revision 45877)

$ mkdir mystuff

$ cd mystuff

# ...Use gedit here to edit test.txt ...

$ ls

test.txt

$

你看到的信息和我看到的不一样也没关系,大体上应该是相似的。

网上搜索

本书最主要的一部分内容是学会从网上学习编程。我会让你“在网上搜一下这个”,你的任务是用搜索引擎寻求答案。我让你搜索而不是直接告诉你答案的原因是,我需要你成为一个具有独立学习能力的人,这样当你学会之后就不需要回来看这本书了。如果你能在网上找到你的问题的答案,那么你就离独立学习更近了一步,这也是我的目标。

多亏了Google这样的搜索引擎,你才能很容易地找到我要你找的答案。如果我说让你“上网搜索一下ruby array function”,你只要像下面这样做就可以了。

1.访问http://google.com/。

2.输入ruby array functions。

3.阅读列出的网站,找到最佳答案。

图0-1所示是我搜索的一个截屏图。

给新手的告诫

你已经完成了这个习题。根据你对计算机的熟悉程度,这个习题对你而言可能会有些难。如果你觉得有难度的话,要自己克服困难,多花点儿时间学习一下,因为如果你不会这些基础操作的话,编程对你来说将会更难学。

如果有人让你终止或者跳过本书的某些章节,你应该就当没听到。任何企图不让你学到某些东西的人,或者更恶劣的,企图让你通过他们而非通过自己努力获取知识的人,都是企图让你依赖他们获取技能。别听他们的,好好做你的习题,这样你就能学会如何自学了。

如果有程序员让你使用vim或者emacs,你就对他们说“不”。当你水平达到一定程度的时候,这些编辑器才适合你用。你现在需要的只是一个可以编辑文本的编辑器。我们使用gedit、TextWrangler、Notepad++是因为它们很简单,而且在不同的系统上使用起来都是一样的。就连专业程序员也会使用这些文本编辑器,所以对你而言,用它们入门已经足够了。

最终你总会听到有程序员建议你使用Mac OS X或者Linux。如果他喜欢字体美观,他会告诉你弄台Mac OS X计算机;如果他们喜欢操作控制而且留了一脸大胡子,他会让你安装Linux。这里再和你说一次,只要是一台能用的计算机就可以了。你需要的只有三样东西:文本编辑器、命令行终端和Ruby。

OS X的程序员会让你使用Homebrew或者Macports,但你不应该使用这些东西。你唯一需要的就是Ruby、TextWrangler和Terminal。Homebrew和Macports可以用来安装大量的软件,但会让你的计算机变得一团糟,到时候不用说你了,连你的程序员朋友都搞不定。不用这些东西,你的计算机就会保持干净整洁,你也可以安心学习这本书了。

Ruby程序员还会让你使用“地道”的Ruby。Ruby程序员理解的“地道”和这个世界上的其他人不一样。对你我来说,“地道”是指“只有说母语的人才懂且书面写作应该避免的令人困惑的词句”,而对Ruby程序员来说“地道”是指“很.简单.最.自然.大家.都.在用.除非.真.程序员”这样的东西。这本书里的代码是地道的,它们简单是因为针对的是你这样的初学者。如果要在地道的Ruby和方便初学者的清晰代码之间做出选择,我会选择后者。你应该告诉这个Ruby程序员,等你把眼前的主要东西都学会了,再学地道的Ruby就完全不是个事儿了。

最后要说的是,这个习题的准备工作的目的就是让你可以在以后的习题中顺利地做到下面几件事。

1.用自己的编辑器编写习题的代码:在Linux下用gedit,在OS X下用TextWrangler,在Windows下用Notepad++。

2.运行你写的习题代码。

3.代码中断的时候修正错误的地方。

4.重复上述步骤。

其他的事情只会让你更困惑,所以还是坚持按计划进行吧。

习题1 第一个程序

应该在习题 0 上花了不少的时间,学会了如何安装文本编辑器,如何运行文本编辑器,如何运行终端,以及如何使用文本编辑器和终端。如果你还没有完成那个练习,请不要继续往下进行,否则你会觉得很不好过的。写在习题开头警告你不要跳过前面内容的警示在本书中仅此一次,切记切记。

将下面的内容写到一个取名为ex1.rb的文件中。Ruby文件最好以.rb结尾。

ex1.rb

1 puts "Hello World!"

2 puts "Hello Again"

3 puts "I like typing this."

4 puts "This is fun."

5 puts "Yay! Printing."

6 puts "I'd much rather you 'not'."

7 puts 'I "said" do not touch this.'

如果你是在Mac OS X下使用TextWrangler,那你的文本编辑器大致是图1-1所示的这个样子。

如果你是在Windows下使用Notepad++,那你看到的应该是图1-2所示的这个样子。

如果你的编辑器长得不是完全一样也不用担心,应该是非常接近的。创建文件时,你要记住以下两点。

1.注意我没有键入左边的行号。这些是为了便于对代码具体的某一行进行讨论(如“参见第5行”)额外加到书里边的。你无需将行号写进Ruby脚本中去。

2.注意截图中开始的puts语句,它和ex1.rb代码范例中的是完全一样的。这里要求你做到“完全一样”,而不是“差不多一样”。要让这段脚本正常工作,代码中的每个字符都必须完全匹配。当然,你的编辑器显示的颜色可能不一样,这并不重要,只有你键入的字符才是重要的。

需要在终端通过输入以下内容来运行这段代码:

ruby ex1.rb

如果写对了,你应该看到和下面“应该看到的结果”一节中一样的输出。如果不一样,就是你哪儿弄错了,计算机是不会错的。

应该看到的结果

在Mac OS X的Terminal下你看到的应该是图1-3所示的这个样子。

在Windows的PowerShell下你看到的应该是图1-4所示的这个样子。

你也许会看到ruby ex1.rb命令前面显示的一些信息不一样,这不是问题,重要的是你键入了这个命令,而且看到了相同的输出。

如果有错误,你会看到与下面类似的信息:

> ruby ex1.rb

ex1.rb:3: syntax error, unexpected tCONSTANT, expecting $end

puts "I like typing this."               ^

你应该学会看懂这些出错信息,这是很重要的一点,因为你以后还会犯类似的错误。就是现在的我也会犯这样的错误。让我们一行一行来看。

1.首先我们在终端输入命令来运行ex1.rb脚本。

2.Ruby告诉我们ex1.rb文件的第3行有一个错误。错误的类型是“Syntax Error”(语法错误),有些程序员专用的术语你通常可以忽略。

3.然后这一行出错的内容被显示出来,以供我们查看。

警告 如果你来自其他国家,而且你看到关于ASCII编码的错误,那就在你的Ruby脚本的最上面加入下面这一行:

# -*- coding: utf-8 -*-

这样你就在脚本中使用了Unicode UTF-8编码,这些错误就不会出现了。

巩固练习

每个习题都有巩固练习要完成。巩固练习里边的内容是供你尝试的。如果你觉得做不出来,可以暂时跳过,过段时间再回来做。

在这个习题中,试试下面几件事儿。

1.让你的脚本再多打印一行。

2.让你的脚本只打印其中的一行。

3.在一行的起始位置放一个“#”字符。它的作用是什么?自己研究一下。

从现在开始,除非是特别难的习题,否则我将不再解释每个习题的工作原理了。注意 #(octothorpe)有很多的英文名字,如pound(英镑符)、hash(电话的#键)、mesh(网)等。选一个你觉得酷的用就行了。

常见问题回答

下面是学生在做这些习题时问过的真实问题。

怎样让编辑器显示不同颜色?

编辑之前先将文件保存为.rb格式,如ex1.rb,后面编辑时你就可以看到各种颜色了。

看到错误信息:ruby: No such file or directory -- ex1.rb (LoadError)。

确认你的运行目录和你创建文件的目录是同一个。你需要先使用cd命令进入这个目录。例如,如果你的文件保存在lrthw/ex1.rb中,那么你需要运行cdlrthw/,然后再运行ruby ex1.rb。如果你看不懂以上内容,那就看一遍附录吧。

习题2 注释和#号

序里的注释是很重要的。它们可以用自然语言告诉你某段代码的功能是什么。想要临时移除一段代码时,你也可以用注释的方式临时禁用这段代码。这个习题就是让你学会在Ruby中使用注释。

ex2.rb

1 # A comment, this is so you can read your program later.

2 # Anything after the # is ignored by ruby.

3

4 puts "I could have code like this." # and the comment after is ignored

5

6 # You can also use a comment to "disable" or comment out a piece of code:

7 # puts "This won't run."

8

9 puts "This will run."

从现在开始,我将用这样的方式来演示代码。我一直在强调“完全一样”,不过你也不必按照字面意思理解。你的程序在屏幕上的显示可能会有些不同,重要的是你在文本编辑器中输入的文本的正确性。事实上,我可以用任何编辑器写出这段程序,而且结果是完全一样的。

应该看到的结果

习题2 会话

$ ruby ex2.rb

I could have code like this.

This will run.

再说一次,我不会再贴各种终端的屏幕截图了。你应该明白上面的内容是输出内容的字面翻译,而$ ruby ...下面的内容才是你应该关心的。

巩固练习

1.弄清楚#字符的作用,并且记住它的名字(英文为octothorpe或者pound character)。

2.打开ex2.rb文件,从后往前逐行检查。从最后一行开始,倒着逐个单词检查回去。

3.有没有发现什么错误呢?有的话就改正过来。

4.读你写的代码,把每个字符都读出来。有没有发现更多的错误呢?有的话也一样改正过来。

常见问题回答

你确定#字符的名称是pound character?

我叫它 octothorpe,这个名字不是哪个国家的标准名称,但所有的人都能看懂它的意思。每个国家都觉得他们的叫法最正确、最闪亮。对我来说这是自大狂的想法,而且说真的,与其去关心这种细枝末节,不如把时间花在更重要的事情上,比如好好学习编程。

如果#是注释的意思,那么为什么# -*- coding: utf-8 -*-能起作用呢?

Ruby其实还是没把这行当做代码处理,这种用法只是让字符编码格式被识别的一个取巧的方案,或者说是一种没办法的办法吧。在编辑器设置里你还能看到一种类似的注释。

为什么puts "Hi # there."里的#没被忽略掉?

这行代码里的#处于字符串内部,所以它就是引号结束前的字符串中的一部分,这时它只是一个普通字符,而不代表注释的意思。

怎样做多行注释?

每行前面放一个#就可以了。

我们国家的键盘上找不到#字符,怎么办?

有的国家要通过Alt键和其他键组合才能输入这个字符。你可以用搜索引擎找一下解决方案。

为什么要让我倒着阅读代码?

这样可以避免让你的大脑跟着每一段代码内容的意思走,这样可以让你精确处理每个片段,从而让你更容易发现代码中的错误。这是一个很好用的查错技巧。

习题3 数字和数学计算

一种编程语言都包含处理数字和进行数学计算的方法。不必担心,程序员经常谎称他们是多么牛的数学天才,其实他们根本不是。如果他们真是数学天才,他们早就去从事数学相关的行业了,而不会为了能开得起跑车,吭哧吭哧写各种毛病多多的Web框架了。

这个习题里有很多数学符号。我们来看一遍它们都叫什么名字。你要一边写一边念出它们的名字来,直到你念烦了为止。名字如下:

+  加号

−  减号

/  斜杠

*  星号

%  百分号

<  小于号

>  大于号

<= 小于等于号

>= 大于等于号

有没有注意到以上只是些符号,没有给出具体的运算呢?写完下面的练习代码后,再回来写出每个符号的作用,完善这个表。例如,+是用来做加法运算的。

ex3.rb

1  puts "I will now count my chickens:"

2

3  puts "Hens #{25 + 30 / 6}"

4  puts "Roosters #{100 - 25 * 3 % 4}"

5

6  puts "Now I will count the eggs:"

7

8  puts 3 + 2 + 1 - 5 + 4 % 2 - 1 / 4 + 6

9

10  puts "Is it true that 3 + 2 < 5 - 7?"

11

12  puts 3 + 2 < 5 - 7

13

14  puts "What is 3 + 2? #{3 + 2}"

15  puts "What is 5 - 7? #{5 - 7}"

16

17  puts "Oh, that's why it's false."

19  puts "How about some more."

21  puts "Is it greater? #{5 > -2}"

22  puts "Is it greater or equal? #{5 >= -2}"

23  puts "Is it less or equal? #{5 <= -2}"

18

20

应该看到的结果

习题3 会话

$ ruby ex3.rb

I will now count my chickens:

Hens 30

Roosters 97

Now I will count the eggs:

7

Is it true that 3 + 2 < 5 - 7?

false

What is 3 + 2? 5

What is 5 - 7? -2

Oh, that's why it's false.

How about some more.

Is it greater? true

Is it greater or equal? true

Is it less or equal? false

巩固练习

1.在每一行的上面使用#为自己写一个注释,说明一下这一行的作用。

2.记得习题0吧?用里边的方法运行Ruby,然后使用刚才学到的数学运算符把Ruby当做计算器玩玩。

3.自己找个想要计算的东西,写一个.rb文件把它计算出来。

4.有没有发现计算结果是“错的”呢?计算结果只有整数,没有小数部分。这里你应该使用“浮点数”(floating point number),也就是带小数点的数,如10.5或者0.89,就连3.0也是一个浮点数。

5.使用浮点数重写一遍ex3.rb,让它的计算结果更准确。(提示:20.0是一个浮点数。)

常见问题回答

为什么%是求余数符号,而不是百分号?

很大程度上只是因为设计人员选择了这个符号而已。正常写作时它是百分号没错,在编程中除法我们用了/,而求余数又恰恰选择了%这个符号,仅此而已。

%是怎么工作的?

换个说法就是“X除以Y余数是J”,例如“100除以16余数是4”。%运算的结果就是J这部分。

运算优先级是怎样的?

在美国,我们用PEMDAS这个简称来辅助记忆,它代表的是Parentheses(括号)、Exponents(指数)、Multiplication(乘)、Division(除)、Addition(加)、Subtraction(减),这就是 Ruby里的运算优先级。

相关图书

Ruby程序员修炼之道(第2版)
Ruby程序员修炼之道(第2版)
面向对象设计实践指南:Ruby语言描述
面向对象设计实践指南:Ruby语言描述
R和Ruby数据分析之旅
R和Ruby数据分析之旅

相关文章

相关课程