本章会介绍Ruby操作时需要掌握的基础知识,主要有以下四部分内容。
1.对象
2.类
3.变量
4.常量
4.1 对象
在Ruby中,表现数据的基本单位为对象(object)。
对象的类型非常多,我们这里只介绍常用的对象。
·数值对象
1、-10、3.1415等是表示数字的对象,另外还有表示矩阵、复数、素数、公式的对象。
·字符串对象
“你好”、“hello”是表示文字的对象
·数组对象、散列对象
表示多个数据集合的对象
·正则表达式对象
表示匹配模式的对象
·时间对象
表示时间的对象
·文件对象
一般我们可以理解为表示文件本身的对象,但确切来说,它是对文件进行读写操作的对象。
·符号对象
表示用于识别方法等名称的标签的对象。
除此之外,Ruby还有范围对象、异常对象等。
4.2 类
Ruby的类(class)表示的就是对象的种类。
对象拥有什么特性等,这些都是由类来决定的。到目前为止,我们所介绍的对象与所属类的对应关系如下:
对象 类
数值 Numeric
字符串 String
数组 Array
散列 Hash
正则表达式 Regexp
文件 File
符号 Symbol
注意:xx类的对象,我们一般也会说成“xx类的实例(Instance)”。所有Ruby对象其实都是某个类的实例,因此在Ruby中的对象和实例的意义几乎是一样的。
4.3 变量
变量就是对象的名片。
Ruby中有四种类型的变量。
- 局部变量(local variable)
以英文字母或者_开头 - 全局变量 (global variable )
以$开头 - 实例变量 (instance variable)
以@开头 - 类变量 (class variable)
以@@开头 - 伪变量 (pseudo variable)
是 Ruby 预先定义好的代表某特定值的特殊变量,因此即使我们在 程序里给伪变量赋值,它的值也不会改变。Ruby 中,nil、true、false、self 等都是伪变量。它们表面上虽然看着像变量,但实际的行为又与变量有差 别,因此称为伪变量。
下面我们来说明局部变量和全局变量的不同。
代码清单 4.1 scopetest.rb
$x = 0
x = 0
require "./sub"
p $x #=> 1
p x #=> 0
代码清单 4.2 sub.rb
$x = 1 #对全局变量赋值
x = 1 #对局部变量赋值
程序首次给局部变量赋值对同时,局部变量就会被初始化,如果引用了未初始化的局部变量,程序就会抛出异常。
2.5.3 :001 > x + 1
Traceback (most recent call last):
1: from (irb#1):1
NameError (undefined local variable or method `x' for main:Object)
4.4 常量
常量和变量一样,是某个对象的“名片”。不过与变量不同的是,对已经赋值的常量再进行赋值时,Ruby会作出警告。
2.5.3 :002 > RES = 1
=> 1
2.5.3 :003 > RES = 2
(irb#1):3: warning: already initialized constant RES
(irb#1):2: warning: previous definition of RES was here
=> 2
2.5.3 :004 > RES
=> 2
我们注意到,虽然会作出警告,但是还是赋值成功了。
常量以大写英文字母开头,例如,Ruby 的运行版本(RUBY_VERSION)、运行平台(RUBY_PLATFORM)、命令行参数数组(ARGV)等,都是 Ruby 预定义的好 的常量。
4.5 保留字
表 4.2 中的单词,在程序中作为名称使用时会受到限制。这些受到限制的单词,我们称为保留字。在程序里,如果不小心使用了 end、next 等作为变量 名,Ruby 会提示我们语法错误。
4.6 多重赋值
我们已经介绍过“变量=值”这样的变量赋值方法,Ruby 还提供了一个只用一个表达式就能给多个变量赋值的简便方法——多重赋值。很多情况下我们都会用 到多重赋值,在这里举几个比较典型的例子供大家参考。
4.6.1合并执行多个赋值操作
a = 1
b = 2
c = 3
可以简化为下面只有一行:
a, b, c = 1, 2, 3
这样就能轻松地将 1、2、3 分别赋值给变量 a、b、c。如果对一组不相关的变量进行多重赋值,程序会变得难懂,因此建议对彼此相关变量进行多重赋值。 即使= 左右两边列表的数量不相等,Ruby 也不会报错。左边被赋值的变量的个数比较多时,Ruby 会自动将 nil 赋值给未分配值的变量。
a, b, c, d = 1, 2
p [a, b, c] #=> [1, 2, nil]
变量部分比较少时,Ruby 会忽略掉该值,不会分配多余的值。
a, b, c = 1, 2, 3, 4
p [a, b, c] #=> [1, 2, 3]
变量前加上*,表示 Ruby 会将未分配的值封装为数组赋值给该变量。
a, b, *c = 1, 2, 3, 4, 5
p [a, b, c] #=> [1, 2, [3, 4, 5]]
a, *b, c = 1, 2, 3, 4, 5
p [a, b, c] #-> [1, [2, 3, 4], 5]
4.6.2 置换变量的值
现在我们来考虑一下如何置换变量 a、b 的值。通常,我们需要一个临时变量 tmp 暂时地保存变量的值。
a, b = 0, 1
tmp = a # 暂时保存变量a 的值
a = b # 将变量b 的值赋值给a
b = tmp # 将原本变量a 的值赋值给变量b
p [a, b] #=> [1, 0]
使用多重赋值,只需一行程序就搞定了。
a, b = 0, 1
a, b = b, a # 置换变量a、b 的值
p [a, b] #=> [1, 0]
4.6.3 获取数组的元素
ary = [1, 2]
a, b = ary
p a #=> 1
p b #=> 2
4.6.4 获取嵌套数组的元素
我们来看看数组 [1, [2, 3], 4],用之前介绍的方法,我们可以分别取出 1,[2, 3]、4 的值。 ary = [1, [2, 3], 4]
ary = [1, [2, 3], 4]
a, b, c = ary
p a #=> 1
p b #=> [2, 3]
p c #=> 4
像下面那样把左边的变量括起来后,就可以再进一步将内部数组的元素值取出来。
ary = [1, [2, 3], 4]
a, (b1, b2), c = ary # 对与数组结构相对应的变量赋值
p a #=> 1
p b1 #=> 2
p b2 #=> 3
p c #=> 4
只要等号左边的变量的结构与数组的结构一致,即使再复杂的结构,多重赋值都可以轻松对应。