ch04 对象、变量和常量

  • 对象
  • 变量
  • 常量

4.1 对象

在 Ruby 中,表现数据的基本单位称为对象(object)。

  • 数值对象

    1、-10、3.1415 等是表示数字的对象,另外还有表示矩阵、复数、素数、公式的对象。

  • 字符串对象

    “你好”、”hello” 等表示文字的对象。

  • 数组对象、散列对象

    表示多个数据的集合的对象。

  • 正则表达式对象

    表示匹配模式的对象。

  • 时间对象

    比如 ”2013年5月30日早上9点“ 等表示时间的对象。

  • 文件对象

    一般我们可以理解为表示文件本身的对象,但确切来说,它是对文件进行读写操作的对象。

  • 符号对象

    表示用于识别方法等名称的标签的对象。

除此之外, Ruby 还有范围对象(Range)异常对象(Exception)等。

4.2 类

Ruby 的类(class)表示的就是对象的种类。

对象拥有什么特性,这些都是由类来决定的。

下图是刚刚介绍过的对象及其所属类的对应关系(这些都是 Ruby 默认提供的):

「 XX 类的对象 」,我们一般会说成 「 XX 类的实例(Instance) 」

例如,我们会说 「 字符串对象 foo 是 String 类的实例 」。

4.3 变量

变量就像是对象的名片。

Ruby 中有四种类型的变量。

  • 局部变量(local variable)
  • 全局变量(global variable)
  • 实例变量(instance variable)
  • 类变量(class variable)

变量的命名方式决定了变量的种类

  • 局部变量
    以英文字母或者_开头
  • 全局变量
    以$开头
  • 实例变量
    以@开头
  • 类变量
    以@@开头

除以上四种类型外,还有名为伪变量(还有一种叫预定义变量,书中没有详细介绍)的特殊变量。
伪变量是 Ruby 预先定义好的代表某特定值的特殊变量,因此即使我们在程序里给伪变量赋值,它的值也不会改变。Ruby中,nil、true、false、self等都是伪变量。它们表面上虽然看着像变量,但实际的行为又与变量有差别,因此称为伪变量。

局部变量与全局变量

局部变量是指 变量在程序中的有效范围(也称变量的作用域)是局部的。

全局变量,不管变量在程序的哪个部分使用,程序就认为它们是同一个变量。

局部变量作用范围只在自己所在的代码块中。全局变量作用范围在所有程序中。

一般并不推荐使用全局变量。全局变量在程序的任何地方都可以修改,因此在规模较大的程序中使用时,会增加程序不必要的复杂度,给阅读程序、修改程序造成意想不到的麻烦。

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

执行示例:

实例变量与类变量,第8章会详细说明。

4.4 常量

常量的作用和变量一样,是某个对象的 「 名片 」。与变量不同的是,对已经赋值的常量再进行赋值时,Ruby 会做出警告。

执行示例:

常量以大写英文字母开头。
例如 Ruby 的运行版本「 RUBY_VERSION 」、运行平台「 RUBY_PLATFORM 」、命令行参数数组「 RARGV 」等,都是 Ruby 预定义好的常量。

4.5 保留字

Ruby 关键字一览表:

这些关键字被称为保留字,如果用做变量名,Ruby 会提示我们语法错误。

执行示例:

4.6 多重赋值

除了「 变量 = 值 」这种给变量赋值的方法,Ruby 中还提供了只用一个表达式就能给多个变量赋值的简便方法

4.6.1

比如:

1
2
3
4
5
6
a = 1
b = 2
c = 3
# 可以简化为
a, b, c = 1, 2, 3

如果一组不相关的变量进行多重赋值,程序会变的难懂,因此建议对彼此相关变量进行多重赋值

即使 = 号左右两边列出的数量不相等,Ruby 也不会报错。

1
2
a, b, c, d = 1, 2
# a = 1 b = 2 c = nil d = nil

变量部分比较少时,Ruby 会忽略掉该值,不会分配多余的值。

1
2
a, b, c = 1, 2, 3, 4
# a = 1 b = 2 c = 3 4不会被分配

变量前加上 * ,表示 Ruby 会将未分配的值封装为数组赋值给该变量

1
2
3
4
5
a, b, *c = 1, 2, 3, 4, 5
# a = 1 b = 2 c = [3, 4, 5]
a, *b, c = 1, 2, 3, 4, 5
# a = 1 b = [2, 3, 4] c = 5

4.6.2 置换变量的值

1
2
3
4
5
a, b = 0, 1
tmp = a # 暂时保存变量a的值
a = b # 将变量b的值赋值给a
b = tmp # 将原本变量a的值赋值给变量b
p a, b # => [1, 0]

使用多重赋值,只需一行程序就搞定了。

1
2
3
a, b = 0, 1
a, b = b, a # 置换变量a、b的值
p a, b # [1, 0]

4.6.3 获取数组的元素

用数组赋值,左边有多个变量时,Ruby 会自动获取数组的元素进行多重赋值。

1
2
3
4
ary = [1, 2]
a, b = ary
p a # => 1
p b # => 2

4.6.4 获取嵌套数组的元素

1
2
3
4
5
ary = [1, [2, 3], 4]
a, b, c = ary
p a # => 1
p b # => [2, 3]
p c # => 4
1
2
3
4
5
6
ary = [1, [2, 3], 4]
a, (b1, b2), c = ary # 对与数组结构相对应的变量赋值
p a # => 1
p b1 # => 2
p b2 # => 3
p c # => 4

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

专栏

以变量名开头来决定变量的种类,这是 Ruby 中对变量命名时唯一要坚决遵守的规则。

◎ 不要过多使用省略的名称

对于多个单词组合的变量名,使用 _ 隔开各个单词,或者单词以大写字母开头
Ruby 的变量名和方法名使用前者,类名和模块名使用后者。