第4章 对象、变量和常量

本章会介绍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   #对局部变量赋值
截屏2021-01-25 下午2.41.44.png

程序首次给局部变量赋值对同时,局部变量就会被初始化,如果引用了未初始化的局部变量,程序就会抛出异常。

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.2

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

只要等号左边的变量的结构与数组的结构一致,即使再复杂的结构,多重赋值都可以轻松对应。

你可能感兴趣的:(第4章 对象、变量和常量)