本文主要内容
Ruby语法的生存工具箱[1]
Ruby基础编程指引:程序编写、保存、运行和错误检查
Ruby安装指南
Ruby的扩展机制
Ruby中易用的命令行工具,包括交互式Ruby解释器(irb)
本书的内容是Ruby基础,而本章是基础中的基石。本章的目标是让读者在开始学习Ruby之前掌握足够的知识和技巧。
接下来读者将看到Ruby的基本语法和技术,以及Ruby的运行机制:如何写一个程序,怎样使用Ruby运行程序,以及如何把一个程序分写到多个文件中。此外,读者还将学习到一些开关(switch)[2]的用法,即它们如何改变Ruby解释器(名为ruby
的程序,用于执行用Ruby语言写的程序文件)的作用,也会学习使用一些重要的辅助工具,让读者的Ruby程序员生涯更加轻松和高效。
本章将Ruby领域的观点分为以下3个基本层次。
- 语言核心:设计原则、语法、语义。
- Ruby支持的扩展(extension)和类库(library),以及用户自己添加到扩展中的工具。
- Ruby自带的命令行工具,用于运行解释器和其他一些重要工具。
这3个部分在一个系统中环环相扣,因此在本书中它们的内容会相互贯穿,不过在本章中会尽量分开讨论。尽管如此,这3个部分的内容都会贯穿在书的每一章中。
{Ruby,ruby,还是RUBY?!!!}
Ruby是一门编程语言。我们会谈论“学习Ruby”,还会问一些问题,比如“你知道Ruby吗?”
ruby
是指一个计算机程序,特指Ruby的解释器,它可以读取并运行程序。可以看到这个命名方式在一些文章中出现,如“你用ruby
运行我的文件,但什么也没发生。”,或者“ruby
可执行文件的完全路径是什么?”最后是RUBY,准确来说,没有这样的写法。Ruby不是一个缩略语词汇,所有字母都大写的拼写方式向来都是错的。人们在对待Perl语言的时候也出现过同样的错误,或许是因为他们看到了如BASIC和COBOL这样的拼写方式,但Ruby不同。一般用“Ruby”来表示编程语言,用“ruby”来表示Ruby的解释器。
第1章不是只为服务于其他章节而存在的,它也有自己存在的价值:学习真正的Ruby技术和这门语言设计中的要点。其目标是为了引导和启发读者,但即使如此,学习过程还是会深入Ruby语言的一些关键层面。
1.1 Ruby语言基础知识
本节的目标是让读者开始接触Ruby。这里采用广度优先的方法:大致围绕语法学习、代码编写、程序运行这样一个循环过程展开。
说到这里,读者需要在自己的电脑上安装好Ruby。书中的例子都使用Ruby 2.1.0[3]编写。还需要准备一个文本编辑器(任何偏好的编辑器都可以,也可以用纯文本编辑器,但文字处理软件不行)和一个存放Ruby程序文件的目录(亦称文件夹)。可以命名目录为rubycode或者rubysamples,无论什么名字都可以,只要能够区别于其他工作区并方便地找到练习程序文件即可。
{交互式Ruby控制台程序(irb)是最好的朋友!!}
随Ruby发布的irb实用工具,是一个Ruby命令行工具,irb使用的广泛程度高于Ruby解释器本身。启动irb之后,键入Ruby代码,它将执行代码并输出结果值。
在命令行中键入
irb
,然后输入在文中所见的示例代码。例如:{:–}
打开irb会话意味着可以随时测试任意数量的Ruby代码段。大多数Ruby程序员都发现irb是不可缺少的,而且本章中的一些示例也是使用irb运行的。
读者将看到下面irb的示例使用了命令行选项,它的输出结果更易于阅读。
运行irb时加入此选项或者不加,就可以看到
--simple-prompt
选项的效果。正如所见,这个简单的提示符选项将使屏幕更简洁明了。默认的(非简单的)提示符显示了更多的信息,如在交互会话时的行号统计。但从众多的示例可以看出,简单的提示符已足够使用。因为irb是一个用于运行Ruby语言的命令行工具,所以直到1.4.2节才会详细讨论它。如有需要,可以转到那一节去看一下,这是最直接的方式。
完成Ruby的安装,并创建好工作目录的,就继续学习Ruby吧,这样我们就能分享Ruby学习和探索中的见地。掌握Ruby的语法将会是一个良好的开端。
1.1.1 Ruby语法生存包
下面3个表总结了Ruby的一些特性,这对于理解本章的例子和开始体验Ruby语言大有益处。不必记住它们,只要看一下并在稍后用到的时候回查即可。
表1-1包含了Ruby的一些基本运算。表1-2中介绍了获取基础键盘输入、将输出发送到屏幕以及基本的条件语句。表1-3简要描述了Ruby的特殊对象和注释的语法。
表1-1 Ruby的基本运算
操 作 | 示 例 | 注 解 |
---|---|---|
算术运算 | 2+3 (加法) 2–3 (减法) 2*3 (乘法)2/3 (除法) 10.3 + 20.25 103 - 202.5 32.9 * 10 100.0 / 0.23 |
所有的运算都使用整型或浮点型。如例子中所示,混合使用整型和浮点型数值进行运算,其结果为浮点型 注意:需要使用 0.23 而不是.23 |
赋值 | x=1 string = "Hello" |
本操作将一个对象(右边)绑定到一个局部变量(左边)之上。与此同时,把对象看作是用变量表示的一个值 |
值比较 | x == y |
注意:使用两个等号(不同于赋值使用一个等号) |
字符串到数值的转换 | x = "100".to _ i s = "100" x = s.to _ i |
为了算术运算的顺利执行,必须保证使用的是数字而不是字符构成的字符串。to _i 用于执行字符串到整型的转换 |
表1-2 Ruby的基本I/O(输入/输出)方法和流控制
操 作 | 示 例 | 注 解 |
---|---|---|
打印到屏幕 | print "Hello" puts "Hello" x = "Hello" puts x x = "Hello" print x
x = "Hello" px |
如果字符串的行尾没有包含换行符,puts 就会添加一个,但print 不会 print 会精确打印内容并让光标留在末尾(提示:在某些系统平台,在程序输出的末尾会自动换行) P 会输出一个审查字符串,它通常会包含一些额外的输出信息 |
获取键盘单行输入 | gets string = gets |
直接将输入的一行赋值给变量(第二个例子中的变量string ) |
条件语句执行 | if x == y puts "Yes!" else puts "No!" end |
条件语句总是以单词end 结束(更多细参见第6章) |
表1-3 Ruby的特殊对象和注释
操 作 | 示 例 | 注 解 |
---|---|---|
特殊值对象 | true false nil |
对象true 和false 通常用于返回条件表达式的值。对象nil是“nonobject ”的一种,表明值或者结果的缺失。false和nil 使得条件表达式失败,所有的其他对象(包括true,当然也包括0 和空字符串)使得其成功(更多细节参见 第7 章) |
默认对象 | self |
关键字self 引用默认对象。self是一个依赖于运行时上下文,由不同对象扮演的角色。没有指定调用者的方法,调用的时候会默认为被self调用(更多细节参见第5章) |
代码中的注释 | # 一个注释x = 1 # 一个注释 |
注释部分,会被编译器忽略 |
以上摘要表中已经包含了许多Ruby的基础和语法。读者需要能够辨认出Ruby标识符(identifier)的几种不同写法,尤其是对Ruby中的对象和方法调用有一个感性认识。我们稍后将会谈论这些内容。
1.1.2 多种多样的Ruby标识符
Ruby的标识符类型很少,一眼就能辨认和区分它们。标识符体系如下。
- 变量(variable):
- 局部变量(local variable);
- 实例变量(instance variable);
- 类变量(class variable);
- 全局变量(global variable)。
- 常量(constant);
- 关键字(keyword);
- 方法名(method name)。
这是一个很小的体系,很容易掌握,这一节将讨论它们。记住本节的目标是学习辨认不同的标识符。本书后面将学习如何使用和使用它们的时机。这只是标识符知识的第一课。
1.变量
局部变量以小写字母或者下划线开头,包含字母、下划线或数字。x
、string
、abc
、start_value
和firstName
都是有效的局部变量命名方式。然而,值得注意的是,在组合多个单词以命名局部变量时,Ruby
的约定是使用下划线作为命名规范,而不使用驼峰命名法,如使用first_name
而不使用firstName
。
实例变量为独立的对象存储信息,它通常以一个单独的符号(@
)开头,后面的字符使用与局部变量相同的命名规则,如@age
和@last_name
。尽管局部变量不能以大写字母开头,但是实例变量可以在@
符号之后的第一个位置使用大写字母(但不能使用数字)。但是通常来说,@
符号之后还是使用小写字母。
类变量在每一个类层级上存储信息(同样,现在也不用担心它的语义)。它与实例变量使用相同的命名规则,只有一点不同,它以两个@
符号(@@
)开头,如@@running_total
。
全局变量可以通过它的美元引导符号($
)辨认出来,如$population
。跟在$
符号之后的语句不使用局部变量的命名规则。有一些全局变量名为$:
、$1
和$/
,还有$stdin
和$LOAD_PATH
。但只要以$
符号开头,它就是一个全局变量。这些非字母的标识符是预定义的,因此不必担心其中的标点符号是否合法。
表1-4总结了Ruby变量的命令规范。
表1-4 总结Ruby变量命名规范
变 量 类 型 | Ruby规范 | 非 规 范 |
---|---|---|
局部变量 | first _ name |
FirstName 、 _ firstName 、 __ firstName 、 name1 |
实例变量 | @first _ name |
@First _ name 、 @firstName 、 @name1 |
类变量 | @@first _ name |
@@First _ name 、 @@firstName 、 @@name1 |
全局变量 | $FIRST</code> _ <code>NAME</code> | <code>$first _ name 、 $firstName 、 $name1 |
2.常量
常量使用大写字母开头。A
、String
、FirstName
、STDIN
都是有效的常量命名。在Ruby命名规范中,如遇到命名多词组合的常量时,可以使用驼峰命名法(FirstName
)也可以使用下划线分隔且所有字母大写(FIRST_NAME
)的方式。
3.关键字
Ruby拥有很多的关键字,它们是预定义的保留词,与特定编程任务和上下文关联。关键字包括def
(用于方法定义)、class
(用于类定义)、if
(条件执行)和FILE
(当前被执行文件的名称)。关键字大约有40个,通常是简短的、单一词汇(与下划线组合多单词方式相反)的标识符。
4.方法名
Ruby中的方法命名遵从与局部变量相同的规则和约定(除了以?
、!
或=
结尾的符号,其重要作用稍后会讲述)。这是一种设计理念:方法并不因其自身作为方法而被人关注,而是简单地作为提供值的表达式融入到程序的结构中。在一些上下文中,很难一眼就区分出一个表达式是一个局部变量还是一个方法名,这一切源自设计,是有意为之。
讲完方法,现在已经有了一张Ruby标识符的“路线图”,让我们谈一下编程语言的语义,尤其是对象及其方法的重要作用。
1.1.3 方法调用、消息和Ruby对象
Ruby把所有的数据结构和值都看做对象,从整数和字符串这样简单的标量(原子的)值,到数组(array)这样的复杂的数据结构一概如此。每个对象都能响应一组特定的消息,对象能够接收的每个消息直接对应一个方法——有名称的、可以被有执行能力的对象触发的可执行例程。
对象也可以用字面量构造器表示,如字符串用双引号,或者已绑定值的变量。消息通过特殊的点运算符(.
)送达:点右边的消息被发送到点左边的对象上。(另外,有许多特殊的给对象发送消息的方式,但是点是最常用和基础的方式。)参见表1-1中的示例:
点(.)意味着消息to_i
被发送给字符串对象"100"
。字符串对象"100"
作为消息的接收者被调用。也可以说是方法to_i
被字符串对象"100"
调用。方法调用的结果是生成整数100&#x