Ruby基础教程(第5版)(txt+pdf+epub+mobi电子书下载)

作者:[日]高桥征义 后藤裕藏

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Ruby基础教程(第5版)

Ruby基础教程(第5版)试读:

前言

乐在其中的编程语言

与计算机程序交流的方式有两种:第一种方式是使用程序,另外一种是编写程序。

然而,编写程序的人相对要少,大部分人都是使用程序而已。这个有点接近读文章的人与写文章的人的比例,读小说、散文、纪实文学等的人很多,但写的人数量就远比读者少了。

这里说的“文章”不仅仅是指商业出版物,还包括个人网站。很多人几乎每天都更新博客,有的是与身边的人分享有趣的事情,有的是提供某些有用的信息。虽然可能只是一些微不足道的信息,但还是会有读者乐于阅读,这类读者就是用户,因此博客也可以说是一种供读者阅读的文章。

大家基于各种目的创建了这类网站,其中不少人是因为很享受自己编写内容的过程。以个人网站为例,单纯追求创作乐趣的人可能会更多。

编程不也是如此吗?也就是说,并不仅仅是为了某种目的而编程,而是因为编程时乐在其中。

编程的乐趣并非单指程序内容,使用的编程语言不同,所获得的乐趣也不一样。像这样,让编程本身变得有趣的编程语言真的存在吗?

——存在。Ruby 就是其中一种。

* * *

Ruby 是一种旨在使大家编程时能乐在其中的编程语言。完全面向对象,有丰富的类库,直观、人性化的语法等都是 Ruby 的特征,但这些并不是 Ruby 的目的,只是实现快乐编程的手段。

程序世界里有着种类繁多的语言。这些语言诞生的缘由多种多样,有的是为了编写运行速度快的程序,有的是为了可以在短时间内编写程序,有的是为了让程序只需编写一次就可以在任何环境中运行,有的是为了使小孩也能进行简单编程,等等。但是,似乎并没有哪个语言积极地宣称其目的是快乐编程。这可能是由于各个语言的设计者并没有认真考虑过让任何人都可以编程吧。

当然,使大家编程时乐在其中的语言,肯定是一种简单易掌握的语言,复杂的语言不可能让人体会到快乐。同时,这门语言又必须是一个功能强大的语言,若非如此,实际编写程序时会非常费劲。毋庸置言,Ruby 就是这样一种简单易掌握,并且功能强大的编程语言。

* * *

为了让零编程经验的读者轻松掌握 Ruby,本书会巨细无遗地介绍 Ruby。从编写程序时所需要的变量、常量、方法、类、流程控制等的语法说明,到主要类的使用方法和简单的应用,都会尽量用通俗易懂的方式来说明。对于从未接触过计算机的读者来说,也许这有点难,但是那些稍微懂点 HTML 的读者很容易就能做到融会贯通。另外,对于那些并非初学者的读者来说,若想再回顾一下 Ruby 的各知识点,本书也能提供不少帮助。

各位读者若能通过本书,熟练掌握 Ruby,找到属于自己的快乐而有趣的编程方式,并灵活运用到实际中,笔者将不胜荣幸。

欢迎来到 Ruby 的世界!

 高桥征义 后藤裕藏关于 Ruby

在开始编程之前,让我们先了解一下什么是 Ruby。● Ruby 是面向对象语言Ruby 是一群热爱面向对象编程的程序员,为了实现最优秀

的面向对象语言而设计、开发出来的。它完全面向对象,所思考

的东西都可以直接通过代码表达出来 1。同时,Ruby 也具有继

承以及 Mix-in 等面向对象语言的必备特性。另外,Ruby 不仅提供了丰富的标准类库,还具有一些能够

提高编程效率的功能,比如应对各种异常的错误处理机制、自动

释放内存的垃圾回收机制等。● Ruby 是脚本语言用 C 语言或者 Java 语言编写的程序,在运行前需要执行编

译这一步骤,把源码翻译成计算机可以理解的机器码。而用脚本

语言编写的源码并不需要编译,可以直接运行。也就是说,在使用脚本语言时,开发流程会从编写源码 → 编译源码 → 运行程序变为编写源码 → 运行程序因此,与需要编译的语言相比,Ruby 更能让大家轻松享受

到编程之趣。● Ruby 是跨平台的语言Ruby 能在 Mac OS X、Linux、FreeBSD、Solaris 等类 Unix

操作系统以及 Windows 操作系统等平台上运行,而且它的大部

分脚本都无需修改即可在不同的平台上运行。● Ruby 是开源软件Ruby 诞生时,松本行弘先生就公开了源码,使之成为开源

软件(自由软件,free software)。任何人都可以随意获取 Ruby,

并自由使用。自 1995 年松本行弘先生在互联网上发布 Ruby 以

来, Ruby 得到了来自各方的广泛支持,并一直活跃至今。

1与面向过程的编程方法相比,我们一般认为面向对象的编程方法比较符合人的思维习惯。——译者注本书的读者对象

本书是一本入门级图书,面向具备一定计算机知识但没有编程经验的读者,旨在帮助他们掌握 Ruby 编程。本书尽量以无需具备专业知识也能读懂的方式向大家介绍 Ruby,但省略了“启动 / 关闭计算机”“Shift 键的使用方法”等基础知识的说明。本书面向以下读者:● 具备操作文件和执行命令等计算机基础知识的读者● 可使用编辑器创建文本文件的读者● 计划学习编程的读者本书的结构

本书采用循序渐进、逐步深入的写作方式,有一定 Ruby 编程基础的读者可能会觉得前半部分有些无趣。建议这类读者快速浏览前两部分,从第 3 部分开始仔细阅读。● 第 1 部分 Ruby 初体验通过简单的 Ruby 小程序介绍 Ruby 程序的基本构成。● 第 2 部分 Ruby 的基础介绍 Ruby 语法、规则等 Ruby 编程的基础知识,以及类、

模块等面向对象编程的相关内容。● 第 3 部分 Ruby 的类要编写程序,只懂语法还远远不够。Ruby 之所以能使大家

快乐编程,主要缘于 Ruby 精心设计的标准类库。在本部分,我们会列举多个 Ruby 的基础类,介绍其功能和

使用方法。● 第 4 部分 动手制作工具在本部分,我们将进行一次总复习,介绍一些稍微复杂的

Ruby 程序,让大家尝试一下用 Ruby 编写实际的程序。● 附录 A 搭建 Ruby 运行环境介绍各个平台的 Ruby 安装方法。● 附录 B 参考介绍使用 Ruby 时所需的知识以及各相关信息。● 习题答案和全书代码清单读者可访问以下网址参考本书习题答案和代码清单。https://rubyjichujiaocheng.github.io/Ruby 的运行环境

本书内容适用于 Ruby 2.3 版本,适用的操作系统为 Windows 10/8.1、Mac OS X,以及 Linux 等常见的类 Unix 操作系统。

在继续阅读本书前,请读者按照附录 A.1 的说明,安装 Ruby 运行环境。

 第 1部分Ruby 初体验让我们先从简单的程序入手,从整体上了解 Ruby 的基本概念,并对如何使用 Ruby 编写程序有个初步印象。第 1 章Ruby 初探

那么,我们赶快来看一下 Ruby 能做些什么。

本章会介绍以下内容。● 使用 Ruby

了解如何使用 Ruby 编写并执行程序。● 使用字符和数值

了解字符和数值是如何输出、计算以及给变量赋值等内容。● 进行条件判断和循环处理

了解如何通过字符串或数值比较进行条件判断处理,以及如何进

行循环处理。

读完本章,大家就能大概掌握用 Ruby 编写程序的方法了。1.1 Ruby 的运行方法

首先,让我们用 Ruby 编写一个在屏幕上输出字符的小程序。

Ruby 程序有多种执行方法,其中最常见的方法是使用 ruby 命令来执行,其次就是使用 irb 命令,以交互式命令行方式来执行。若只是想执行小程序,使用 irb 命令会相对简单一点。

接下来,我们先介绍 ruby 命令以及 irb 命令的使用方法。

另外,读者如果还没安装 Ruby,请参考附录 A 预先安装好 Ruby 运行环境。

注 本书适用于 Ruby 2.3。由于 Mac OS X 和 Linux 系统默认安装的 Ruby 版本比较旧,因此请读者安装新版本的 Ruby。1.1.1 ruby 命令的执行方法

首先,让我们看看代码清单 1.1 的程序。

代码清单1.1 helloruby.rbprint("Hello, Ruby.\n")

注 日文 Windows 系统中的 \ 会显示为¥,原则上本书统一书写为 \。

各位是否有些沮丧呢?一般听到“程序”,我们可能会联想到一长串密码似的东西,但这个程序的代码只有一行,总共才 20 来个字符。可这的确是一个真真切切的程序,执行后就可以达到我们预期的目的。

请大家打开编辑器,写入上述程序,将文件名修改为 helloruby.rb,然后保存文件。.rb 是 Ruby 程序的后缀,表示这个文件内容是 Ruby 程序。

备注 写代码时会用到编辑器或者 IDE,它们的相关内容请参考 A.5 节。

接下来让我们启动控制台,执行程序。

备注 关于控制台的启动方法,请参考附录 A 中各操作系统的说明。

启动控制台后,使用 cd 命令,移动到存放 helloruby.rb 的文件夹中。例如,使用 Windows,文件放在 C 盘的 src 文件夹(c:\src),然后执行以下命令:> cd c:\src

接着再执行如下命令:> ruby helloruby.rb

执行后,如图 1.1 所示,会显示“Hello, Ruby.”。图1.1 执行Ruby

备注 如果执行时出错,请参考第 10 章专栏以及附录 A 的内容。1.1.2 irb 命令的执行方法

接下来,我们介绍 irb 命令的执行方法。

与 ruby 命令一样,irb 命令在控制台执行,不过不需要指定程序文件。

执行 irb 命令后,就会出现下面这样的命令提示符。1

1使用 Ruby Instarller for Windows 安装包安装的 Ruby,在执行 irb 命令的时候有可能会显示“DL is deprecated, please use Fiddle”这样的警告。这是由于 Ruby Instarller for Windows 安装包附带的 readline 库引用了名为 DL 的旧版本的库,但这个警告不会对使用有任何影响。——译者注

执行示例> irbirb(main):001:0>

在这里,只需把刚才代码清单 1.1 的代码原封不动地在控制台写一次,然后直接按下回车键,即可执行程序。

执行示例irb(main):001:0> print("Hello, Ruby.\n")Hello, Ruby. ← print 方法输入的结果=> nilirb(main):002:0>

备注 第三行的 nil 是 print 方法的返回值。关于方法的返回值我们将在 7.3.1 节详细说明。

像这样,在控制台写的程序可以马上在控制台执行,这对进行简单的小测试非常方便。但是,这个方法并不适合大程序,这时我们应该考虑使用 ruby 命令。

在控制台输入 exit 后,按回车键,或者同时按下 Ctrl + d,都可以终止 irb 命令。

注 在使用 Mac OS X 或 Windows 时,irb 命令会有无法正确输入中文的情况。这时可在 irb 命令后加上 --noreadline 选项,执行 irb --noreadline 命令。这样一来,关闭 readline 功能后,就可以正常输入中文了。但请注意,由于关闭了 readline 功能,在控制台编辑已经输入的字符、查看历史输入记录等功能都将无法使用。1.2 程序解说

接下来,让我们详细解说一下代码清单 1.1 的程序,虽然代码只有孤零零的一行。1.2.1 对象

首先,请留意 "Hello, Ruby.\n" 这部分。print("Hello, Ruby.\n") └─字符串对象

这部分被称为 String 对象或者字符串对象,也可以直接称这部分为字符串。也就是说,这部分是一个代表字符串 Hello, Ruby. 的对象(图 1.2)。图1.2 数据与对象

字符串、数值、时间等各种数据,在 Ruby 中都是对象。

备注 字符串末尾的 \n 是换行符。1.2.2 方法

这一次,让我们留意一下 print 这部分。print("Hello, Ruby.\n") └─方法 └─参数

print 是一个方法。所谓方法,就是对象的行为。数值的加法或乘法运算、字符串的合并、某时刻一小时后或者一天后的计算等操作,都是通过执行方法来实现的。

print 方法的作用就是输出 () 里的内容。因此,执行 helloruby.rb 后,在控制台显示了字符串对象“Hello, Ruby.”。

我们把执行方法时必需的条件称为参数。例如,我们在说明 print 方法时,会说“print 方法会把作为参数传递过来的字符串输出到控制台中”。

我们更换一下 print 方法的参数,试一下把它换成其他字符串。print("Hello, RUBY!\n")

这次输出的是大写字母的“Hello, RUBY!”。是不是感觉会更加精神点呢?1.3 字符串

我们再详细看看有关字符串的内容。1.3.1 换行符与 \

上文我们提到过字符 \n 是换行符。利用换行符,我们可以用普通的字符达到换行的效果,例如,为达到以下效果,程序可以这么写:Hello,Ruby!

程序可以这么写:print("Hello,\nRuby\n!\n") ↑_____↑__↑____换行符

原本也可以像下面这样写:print("Hello,Ruby!")

虽然输出结果与第一种写法是一样的,但是这样的写法会降低程序的可读性,因此并不是一个好的写法。既然 Ruby 已经帮我们准备了换行符,我们就直接用第一种方法吧。

除了 \n 以外,当我们想在字符串里嵌入特殊符号时,也会用到 \。双引号是表示字符串开始和结束的符号,假设我们希望字符串里包含双引号,程序要写成 \"。print("Hello, \"Ruby\".\n")

的输出结果为:Hello, "Ruby".

像这样,程序会对字符串中 \ 后的字符做特殊处理。2 因此,如果字符串中需要包含 \,程序要写成 \\。

2这个过程称为转义,\ 称为转义字符。——译者注print("Hello \\ Ruby!")

的输出结果为:Hello \ Ruby!

请注意,两个 \ 的输出结果是一个 \。1.3.2 ' ' 与" "

创建字符串对象除了可以使用 " "(双引号)外,也可以使用 ' '(单引号)。我们试着把之前程序的双引号换成单引号,看一下有什么样的效果。print('Hello, \nRuby\n!\n')

如下所示,程序会原封不动地输出单引号里的内容。Hello, \nRuby\n!\n

也就是说,在单引号里,像 \n 这样的特殊字符不经过转义,程序会原封不动地直接输出。但也有例外,例如在字符串里想嵌入 \ 与单引号时,还是需要在之前加上 \。print('Hello, \\ \'Ruby\'.')

输出结果为:Hello, \ 'Ruby'.1.4 方法的调用

关于方法,我们再详细说明一下。 Ruby 在调用方法时可以省略 ()。因此,代码清单 1.1 的 print 方法可以这样写:print "Hello, Ruby.\n"

另外,如果想连续输出多个字符串,可以用逗号(,)分隔各字符串,程序会按顺序输出字符串。因此,如下写法也是可以的:print "Hello, ", "Ruby", ".", "\n"

虽然这种写法可以方便地输出多个字符串,但是如果遇到比较复杂的参数,使用 () 会更加便于理解。因此,建议在习惯 Ruby 的语法之前,不要使用省略 () 的写法。在一些较为简单的情况下,本书会使用省略 () 的写法。

一般来说,Ruby 是以从上到下的顺序执行方法的。例如,执行下面的程序会得到相同的结果,也就是“Hello, Ruby.”。print "Hello, "print "Ruby"print "."print "\n"1.5 puts 方法

puts 方法与 print 方法稍有区别,puts 方法在输出结果的末尾一定会输出换行符。用 puts 方法时,代码清单 1.1 的程序可改写为这样:puts "Hello, Ruby."

不过,当参数为两个字符串时,puts "Hello, ", "Ruby!"

各字符串末尾都会加上换行符,因此会输出下面的结果。Hello,Ruby!

某些情况下,使用 print 方法可能会顺手些;而某些情况下,使用 print 方法并不方便。请大家按照实际情况选择该使用哪个方法。1.6 p 方法

接下来,我们再介绍一个与输出有关的方法。Ruby 提供了一个更简单的输出对象内容的方法——p 方法。

无论使用 print 方法还是 puts 方法,输出数值 100 和字符串 "100" 时,结果都只是单纯的 100。这样一来,我们就无法判断输出的结果到底是属于哪个对象。这种情况下,p 方法可以很好地解决这个问题。使用 p 方法时,数值结果和字符串结果会以不同的形式输出。让我们赶快来尝试一下。puts "100" #=> 100puts 100 #=> 100p "100" #=> "100"p 100 #=> 100

备注 本书在表示程序输出内容时,会在方法的旁边添加 #=> 字符,其右侧即为方法的输出结果。在这个例子里,puts "100"、puts 100、p 100 的输出结果为字符串 100,p "100" 的输出结果为字符串 "100"。

像这样,输出结果为字符串时,会被双引号括起来,一目了然。另外,使用 p 方法时,换行符(\n)、制表符(\t)等特殊字符不会转义,会像下面这样直接输出(代码清单 1.2)。

代码清单1.2 put_and_p.rbputs "Hello,\n\tRuby."p "Hello,\n\tRuby."

执行示例> ruby puts_and_p.rbHello, Ruby."Hello,\n\tRuby."

如果只是需要输出程序执行的结果、信息等,可以选择 print 方法;如果想确认程序的执行情况,则可选择 p 方法。原则上,p 方法是提供给编程者使用的。1.7 中文的输出

到目前为止,我们使用的字符串都只包含字母。

接下来,我们看一下如何输出中文字符。其实,输出中文字符也不是多难的事,只要把双引号内的字母换成中文字符即可,如下所示。

代码清单1.3 kiritsubo.rb3

3kiritsubo 是日语“桐壺”的发音,此处引用的是《源氏物语》第一回“桐壶更衣”的相关内容。下同。——编者注print " 话说某个朝代,后宫妃嫔甚多,\n"print " 其中有一宫女,出身并不十分高贵,却蒙圣恩宠爱。\n"

执行示例> ruby kiritsubo.rb话说某个朝代,后宫妃嫔甚多,其中有一宫女,出身并不十分高贵,却蒙圣恩宠爱。

不过,编码设定不当也会导致输出错误、乱码等情况。遇到这样的情况时,请参考专栏“使用中文的注意事项”。

专栏

使用中文的注意事项

在某些 Ruby 运行环境中,执行包含中文的脚本时,有可能出现以下错误。执行示例> ruby kiritsubo.rbkiritsubo.rb:1: invalid multibyte char (UTF-8)kiritsubo.rb:1: invalid multibyte char (UTF-8)

这是编写程序时没有指定程序的编码方式造成的。Ruby 程序的编码方式,是通过在程序的首行代码添加注释“# encoding: 编码方式”来指定的(编码的规则称为 encoding)。我们称这个注释为魔法注释(magic comment)。

例如,使用简体中文版 Windows 常用编码 GBK 编写代码时,可像下面这样写魔法注释。# encoding: GBKprint " 话说某个朝代,后宫妃嫔甚多,\n "print " 其中有一宫女,出身并不十分高贵,却蒙圣恩宠爱。\n "

这样指定程序的编码方式后,Ruby 在执行程序时就可以正确识别程序中的中文了。下表是各平台常用的编码方式。平台有多个常用编码方式时,请按照实际情况选择适合的编码方式。平台编码方式WindowsGBK(或者 GB 2312)Mac OS XUTF-8UnixUTF-8

另外,若没指定魔法注释,Ruby 会默认使用 UTF-8 编码方式。因此,在 Ruby 2.0 中如果希望代码采用 UTF-8 的编码方式时,可省略魔法注释。

除此以外,使用上述 p 方法输出中文时,有时也会出现乱码的情况。这时,可使用“-E 编码方式”这个选项来指定输出结果的编码方式。例如,希望以 UTF-8 编码方式在控制台输出结果时,可像下面这样执行命令。

执行示例> ruby -E UTF-8 脚本文件名 ← 脚本执行> irb -E UTF-8 ← irb 启动1.8 数值表示与计算

讲解了字符串之后,让我们再来看看 Ruby 是怎么处理数值的。在 Ruby 程序中,整数和小数(浮点数)的处理方式都很自然。1.8.1 数值

首先,让我们来了解一下 Ruby 是如何表示数值的。1.2 节提到,Ruby 中的字符串是以字符串对象的形式存在的。同样地,数值也是以“数值对象”的形式存在的。

Ruby 的整数的表示方法很简单,直接输入数字就可以了,例如,1

表示 1 的整数(Fixnum)对象。同样地,100

表示 100 的整数对象。再如,3.1415

表示的是 3.1415 的浮点数(Float)对象。

备注 Fixnum 和 Float 是对象所属类(class)的名称。类的详细内容我们将会在第 4 章和第 8 章说明。

数值的输出与字符串输出一样,也是使用 print 方法和 puts 方法。puts(10)

执行以上代码后,屏幕中会显示以下输出结果。

执行示例101.8.2 四则运算

Ruby 还可以对数值进行运算,并输出其结果。我们来看看 Ruby 是怎么进行四则运算的。

首先,我们试着用一下 irb 命令。

执行示例> irb --simple-prompt>> 1 + 1=> 2 ← 1 + 1 的执行结果>> 2 - 3=> -1 ← 2 - 3 的执行结果>> 5 * 10=> 50 ← 5 * 10 的执行结果>> 100 / 4=> 25 ← 100 / 4 的执行结果

备注 irb 命令后的选项 --simple-prompt 会简化 irb 的输出结果。

在一般的编程语言中,乘法运算符用 *(星号),除法运算符用 /(正斜杠)。Ruby 也延续了这个习惯。

我们再来试一下复杂点的四则运算。四则运算的基本原则是“先乘除后加减”,Ruby 也遵循这个原则。也就是说,20 + 8 / 2

的结果是 24。如果希望 20 + 8 后再除以 2,可以使用括号,如下所示,这时答案为 14。(20 + 8) / 21.8.3 数学相关的函数

除四则运算外,Ruby 中还可以使用数学函数,如平方根、sin 和 cos 等三角函数、指数函数等。使用数学函数时,必须在函数前加上 Math.。

备注 不想在函数前加 Math. 时,则需要 include Math 这段代码。关于这些用法,我们会在 8.7.2 节进行说明。

求正弦时使用 sin 方法,求平方根时使用 sqrt 方法。执行相对应的函数方法,即可得到该函数的计算结果。一般我们称这一过程为“执行方法后得到结果”,所得到的结果则称为返回值。

执行示例> irb --simple-prompt>> Math.sin(3.1415)=> 9.26535896604902e-05 ← sin 方法的返回值>> Math.sqrt(10000)=> 100.0 ← sqrt 方法的返回值

注 不同的 Ruby 版本,或者在不同平台下执行时,返回值的位数可能会不同。

第一个返回值的结果是 9.26535896604902e-05,这是一种用来表示极大数或极小数的方法。“(小数)e(整数)”表示“(小数)* 10 的(整数)次幂”。这个例子中,其结果值为“9.26535896604902×10 的-5 次幂”,也就是 0.0000926535896604902。1.9 变量

变量是程序中不可缺少的元素之一,可以将其理解为给对象贴上的标签。

我们可以像下面这样给对象贴上标签(图 1.3)。

变量名 = 对象

这个过程称为“将对象赋值给变量”。图1.3 变量和对象alphabet = "abcdefg"num = 10age = 18name = 'GAOQIAO'

为了说明如何使用变量,我们来看看下面这个求长方体表面积和体积的例子(代码清单 1.4)。

代码清单1.4 area_volume.rbx = 10y = 20z = 30area = (x*y + y*z + z*x) * 2volume = x * y * zprint " 表面积=", area, "\n"print " 体积=", volume, "\n"

若不使用变量,则程序会像下面这样。print " 表面积=", (10*20 + 20*30 + 30*10) * 2, "\n"print " 体积=", 10*20*30, "\n"

这样一来,一旦要修改一个值,那么好几个地方也必须一起修改。上例只有两行代码,修改起来并不太麻烦,但遇到比较复杂的程序时,修改起来就会非常费劲。

另外,变量还可以清晰地表示某个值所代表的含义。因此,为变量起一个容易理解的名称非常重要。例如,下面这样的代码会让人完全搞不清楚这个程序的目的。所以,建议大家平时多加注意,最好使用 area、volume 等意义明确的单词作为变量名。hoge = (foo*bar + bar*baz + baz*foo) * 2funi = foo * bar * bazprint 方法和变量

我们再来回顾一下 print 方法。print " 表面积=", area, "\n"

这个 print 方法有三个参数:" 表面积= "、area、"\n"。print 方法会按照顺序,输出这三个参数。

" 表面积= " 表示值为“表面积=”的字符串,因此 print 方法会直接输出。area 表示 area 这个变量引用的对象,在这个例子里就是 2200 这个整数,因此 print 方法会输出该整数值。

最后那个 "\n" 是换行符,因此 print 方法也会直接输出。

这三个值经过 print 方法处理后,会在屏幕输出“表面积= 2200”加换行的结果。

传递给 print 方法的字符串参数也可以像下面这样写。print " 表面积= #{area}\n"

" 表面积= #{area}\n" 整体为一个字符串。#{area} 这样的写法表示把 area 的值嵌入到字符串中。在字符串中使用 #{ 变量名 } 这样的写法,可以把通过计算后得到的值嵌入到字符串中。输出结果中除了可以嵌入变量名,也可以嵌入 " 表面积= #{(x*y + y*z + z*x) * 2}\n" 这样的计算公式,得到的输出结果是一样的。

一般向屏幕输出结果时,也会同时输出换行符,因此使用 puts 方法时,连 \n 也都不需要了,这样程序会变得更加简洁。puts " 表面积= #{area}"1.10 注释

我们可以在程序中写注释。注释虽然写在程序中,但程序并不会执行注释的内容,也就是说,注释的内容对程序的执行结果不会产生任何影响。

大家也许会问:“为什么会在程序中写这种与程序运行无关的东西呢?”的确,对于只会执行一次的简单程序,并不需要特别的注释。但是,一般来说,我们都会多次使用写好的程序。那么,若希望记录以下内容时,就需要用到注释。● 程序的名称、作者、发布条件等信息● 程序说明

Ruby 用 # 表示注释的开始 4。某行以 # 开头时,表示整行都是注释。某行中间出现 # 时,则 # 以后部分就都是注释。另外,用 =begin 和 =end 括起来的部分也是注释 5,在程序开头或结尾写较长说明时会经常用到这样的写法。

4单行注释。——译者注

5多行注释。——译者注

代码清单1.5 comment_sample.rb=begin《Ruby 基础教程(第5 版)》示例注释的使用示例2006/06/16 创建2006/07/01 追加一部分注释2015/10/01 第5 版更新=endx = 10 # 宽y = 20 # 长z = 30 # 高# 计算表面积和体积area = (x*y + y*z + z*x) * 2volume = x * y * z# 输出print " 表面积=", area, "\n"print " 体积=", volume, "\n"

除此以外,注释还有使某行代码“暂时不执行”的作用。

Ruby 没有 C 中使行的某部分成为注释的写法,只要是以 # 开始的部分,到行末为止一定都是注释。1.11 控制语句

编程语言中都有控制语句。

控制语句能让程序在某种条件下,改变执行顺序,或者只执行某一部分。控制语句的分类

控制语句大致可以分成以下几类。● 顺序控制:按照程序的编写顺序,从头到尾执行● 条件控制:若某条件成立,则执行○○,否则执行 ××● 循环控制:在某条件成立之前,反复执行○○● 异常控制:发生某种异常时,执行○○

顺序控制是程序最常见的处理方式。若不做特殊处理,程序会按照代码的编写顺序执行。

条件控制,是指根据条件执行分支处理。如果没有满足条件,程序会跳过某部分处理,继续执行其他处理。在 Ruby 中,可使用的条件判断语句有 if、unless、case 等。

循环控制,是指根据条件反复执行某个处理。在这种情况下,该处理的执行顺序会与程序编写的顺序不同,执行过一次的程序,会从头再执行一次。

异常控制有点特殊。程序执行时,如果发生意料之外的错误,就会跳出正在执行的那部分程序,然后执行其他地方的程序,使程序能继续执行下去。根据实际情况,有时也会让程序马上结束。

接下来,我们进一步介绍条件控制和循环控制。1.12 条件判断:if~then~end

if 语句用于根据条件变化改变程序的行为,其语法如下所示。

if 条件 then   条件成立时执行的处理end

条件一般是指能返回 true 或者 false 的表达式。例如比较两个值,相同则返回 true,不同则返回 false,这样的表达式可作为条件。

我们在比较数值的大小时会用到等号、不等号等运算符。在 Ruby 中,= 已经被用作赋值运算符了,因此判断是否相等的运算符要用两个并列等号 == 来代替 =。另外,≤和≥运算符在 Ruby 中分别用 <= 和 >= 来替代。

条件表达式返回的结果为 true 或者 false,true 表示条件成立,false 表示条件不成立。p (2 == 2) #=> truep (1 == 2) #=> falsep (3 > 1) #=> truep (3 > 3) #=> falsep (3 >= 3) #=> truep (3 < 1) #=> falsep (3 < 3) #=> falsep (3 <= 3) #=> true

我们也可以使用 == 运算符比较字符串。字符串内容相同则返回 true,内容不同则返回 false。p ("Ruby" == "Ruby") #=> truep ("Ruby" == "Rubens") #=> false

判断值不相等时要使用 != 运算符,它与≠意思相同。p ("Ruby != "Rubens") #=> truep (1 != 1) #=> false

接下来,我们来看一下如何使用这些运算符编写条件语句。代码清单 1.6 是一个简单的程序:变量 a 大于等于 10 时输出 greater,小于 9 时输出 smaller。

代码清单1.6 greater_smaller.rba = 20if a >= 10 then print "greater\n"endif a <= 9 then print "smaller\n"end

这里可以省略 then 关键字。if a >= 10 print "bigger\n"end ┆

如果希望对条件成立和条件不成立时采取不同的处理,我们可以使用 else 关键字。

if 条件 then   条件成立时执行的处理else   条件不成立时执行的处理end

使用 else 关键字改写代码清单 1.6,得到的代码清单 1.7 如下所示。

代码清单1.7 greater_smaller_else.rba = 20if a >= 10 print "greater\n"else print "smaller\n"end1.13 循环

有时,我们会遇到希望多次循环执行相同处理的情况。下面,我们来介绍两种执行循环处理的方法。1.13.1 while 语句

while 语句是执行循环时用到的一种基本语句。同样地,do 关键字可以省略。

while 循环条件 do   希望循环的处理end● 例:按顺序输出从 1 到 10 十个数字

i = 1

while i <= 10

print i, "\n"

i = i + 1

end1.13.2 times 方法

循环处理的循环次数如果已确定,使用 times 方法会更加简单。

循环次数 .times do   希望循环的处理end● 输出 100 行“All work and no play makes Jack a dull boy.”

100.times do

print "All work and no play makes Jack a dull boy.\n"

end

times 方法被称为迭代器(iterator)。迭代器是 Ruby 的一个特色功能。从迭代器的英语拼写也可以知道,迭代器表示的是循环(iterate)的容器(-or)。类似地,运算符(operator)也就是运算(operate)的容器(-or),等等。总之,迭代器就是指用于执行循环处理的方法。

Ruby 除了 times 方法外,还提供了很多迭代器,典型的有 each 方法。each 方法的相关内容,我们会在第 2 章中与数组、散列一起介绍。第 2 章便利的对象

在第 1 章中,我们介绍了 Ruby 的基本数据对象“字符串”以及“数值”。当然,Ruby 能使用的数据对象不可能只有这两种。大部分的 Ruby 程序中涉及的数据对象的结构都要复杂得多。

假设现在我们用 Ruby 做一个通讯录,通讯录一般有以下项目。● 名字● 拼音● 邮政编码● 地址● 电话号码● 邮箱地址● SNS 的 ID● 登记日期

这些项目都能用字符串表示。

将这些项目集合起来后就可以表示一个人的基本信息(图 2.1),再把亲朋好友的基本信息都收集后就成为一本通讯录。图2.1 收集、汇总各项目

像图 2.1 这样,不同数据间的组合无法用字符串或数值这样简单的对象来表示,因此我们需要可以表示数据集合的数据结构。

本章我们将介绍数组和散列这两种新的数据结构。另外,我们还会介绍处理字符串时常用的工具——正则表达式。

备注 像数组、散列这样保存对象的对象,我们称为容器(container)。

数组、散列、正则表达式的应用十分广泛,关于它们的详细用法我们会在后面的章节介绍,在这里我们只会简略地说明一下,让大家对它们有个初步印象。2.1 数组

数组(array)是一个按顺序保存多个对象的对象,它是基本的容器之一。我们一般称为数组对象或者 Array 对象。2.1.1 数组的创建

要创建数组,需要把各数组的元素用逗号隔开,然后再用 [] 把它们括起来。首先,我们来创建一个简单的数组。names = [" 小林", " 林", " 高野", " 森冈"]

在这个例子中,我们创建了一个叫 names 的数组对象,分别保存了 4 个数组元素:" 小林 "、" 林 "、" 高野 "、" 森冈 ",如图 2.2 所示。图2.2 数组对象2.1.2 数组对象

在数组元素对象还未确定的情况下,可以用 [] 表示一个空数组对象。names = []

除此以外还有其他方法创建数组,我们将会在第 13 章再详细说明。2.1.3 从数组中抽取对象

保存在数组中的每个对象都各自有一个表示其位置的编号,称为索引(index)。利用索引,我们可以进行把对象保存到数组、从数组中抽取对象等操作。

要从数组中抽取元素(对象),可以使用以下方法。

数组名 [ 索引 ]

如下所示,有一个名为 names 的数组对象。names = [" 小林 ", " 林 ", " 高野 ", " 森冈 "]

把 names 数组中的第一个元素取出来,如下所示。names[0]

因此,若执行以下代码,print " 第一个名字为", names[0], "。\n"

得到的结果为:第一个名字为小林。

同样地,names[1] 表示 " 林 ",names[2] 表示 " 高野 "。

执行示例> irb --simple-prompt=> names = [" 小林", " 林", " 高野", " 森冈"]=> [" 小林", " 林", " 高野", " 森冈"]>> names[0]=> " 小林">> names[1]=> " 林">> names[2]=> " 高野">> names[3]=> " 森冈"

备注 数组的索引值从 0 开始,并非 1。因此,a[1] 返回的并不是数组第一个元素,而是第二个元素。刚接触编程时,大家比较容易弄错(即便是熟悉以后也有可能会犯这样的错误)。在使用数组时,请务必注意索引值这个特点。

 

注 在 Windows 命令行中,用 Alt + Shift 键切换中英文输入法模式。2.1.4 将对象保存到数组中

我们可以将新的对象保存到已经创建的数组中。

将数组中的某个元素替换为其他对象时,可以使用如下方法。

数组名 [ 索引 ] = 希望保存的对象

我们试着替换一下刚才的 names 数组的内容,将 " 野尻 " 放在数组首位。names [0] = " 野尻 "

执行下面的程序,我们可以知道 " 野尻 " 的确已经变为数组的首位元素。

执行示例> irb --simple-prompt>> names = [" 小林", " 林", " 高野", " 森冈"]=> [" 小林", " 林", " 高野", " 森冈"]>> names[0] = " 野尻"=> " 野尻">> names=> [" 野尻", " 林", " 高野", " 森冈"]

在保存对象时,如果指定了数组中不存在的索引值,则数组的大小会随之而改变。Ruby 中数组的大小是按实际情况自动调整的1。

1即动态数组。——译者注

执行示例> irb --simple-prompt>> names = [" 小林", " 林", " 高野", " 森冈"]=> [" 小林", " 林", " 高野", " 森冈"]>> names[4] = " 野尻"=> " 野尻">> names=> [" 小林", " 林", " 高野", " 森冈", " 野尻"]2.1.5 数组的元素

任何对象都可以作为数组元素保存到数组中。例如,除了可以创建字符串数组,还可以创建数值数组。num = [3, 1, 4, 1, 5, 9, 2, 6, 5]

Ruby 数组还可以保存多种不同的对象。mixed = [1, " 歌", 2, " 风", 3]

这里,我们不再举其他例子了,像时间、文件等对象也都可以作为数组元素。2.1.6 数组的大小

我们可以用 size 方法获知数组的大小。例如,若想获知数组 array 的大小,程序可以像下面这么写。array.size

我们现在就用 size 方法,查看一下刚才的 names 数组的大小。

执行示例> irb --simple-prompt>> names = [" 小林", " 林", " 高野", " 森冈"]=> [" 小林", " 林", " 高野", " 森冈"]>> names.size=> 4

size 方法的返回值就是数组的大小。2.1.7 数组的循环

有时,我们希望输出所有数组元素,或者对在数组中符合某条件的元素执行 xx 方法,不符合条件的执行 yy 方法。为达到这些目的,我们需要一种方法遍历所有数组元素。

为此,Ruby 提供了 each 方法。我们在第 1 章介绍迭代器时,已经稍微接触了一下 each 方法。

each 方法的语法如下所示。

数组 .each do | 变量 |   希望循环的处理end

each 后面在 do ~ end 之间的部分称为块 2(block)。因此,each 这样的方法也可以称为带块的方法。我们可以把多个需要处理的内容合并后写到块里面。

2也称为代码块。——译者注

块的开始部分为 | 变量 |。each 方法会把数组元素逐个取出来,赋值给 | 变量 | 指定的变量,然后循环执行块中的方法。

接下来,我们实际操作一下,按顺序输出数组 names 的元素。

执行示例> irb --simple-prompt>> names = [" 小林", " 林", " 高野", " 森冈"]=> [" 小林", " 林", " 高野", " 森冈"]>> names.each do |n| ┐ 像do~end这样跨多行的?> puts n ├------------代码,输入end之前代码>> end ┘ 是不会执行的小林 ┐林 ├-------puts方法的执行结果高野 │森冈 ┘=> [" 小林", " 林", " 高野", " 森冈"] ---------each方法的返回值

每循环一次,就会把当前的数组元素赋值给变量 n(图 2.3)。图2.3 循环时n的变化

除了 each 方法外,数组还提供了许多其他带块的方法,我们在实际的数组操作中会经常使用到,详细内容会在 13.6 节介绍。2.2 散列

散列(hash)也是一个程序中常用到的容器。在散列中,一般是以字符串或者符号作为键,来保存对应的对象(图 2.4)。图2.4 散列2.2.1 什么是符号

在 Ruby 中,符号(symbol)与字符串对象很相似 3,符号也是对象,一般作为名称标签使用,表示方法等的对象的名称。

3可以将符号简单理解为轻量级的字符串。——译者注

要创建符号,只需在标识符的开头加上 : 就可以了。sym = :foo # 表示符号“:foo”sym2 = :"foo" # 意思同上

符号能实现的功能,大部分字符串也能实现。但在像散列的键这样只是单纯判断“是否相等”的处理中,使用符号会比字符串更加有效率,因此在实际编程中我们也会时常用到符号。

另外,符号与字符串可以互相转换。对符号使用 to_s 方法,则可以得到对应的字符串。反之,对字符串使用 to_sym 方法,则可以得到对应的符号。

执行示例> irb --simple-prompt>> sym = :foo=> :foo>> sym.to_s # 将符号转换为字符串=> "foo">> "foo".to_sym # 将字符串转换为符号=> :foo2.2.2 散列的创建

创建散列的方法与创建数组的方法差不多,不同的是不使用 [],而是使用 {} 把创建的内容括起来。散列用“键 => 对象”这种格式来定义获取对象时所需的键(key),以及键相对应的对象(object)。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书

若在网站上没有找合适的书籍,可联系网站客服获取,各类电子版图书资料皆有。

客服微信:xzh432

登入/注册
卧槽~你还有脸回来
没有账号? 忘记密码?