数组

想一起处理多个对象就要使用数组

数组的生成

在 [] 符号中间排列多个元素就生成了一个数组。如下例所示。

a = ["阿莱库斯","布莱恩","卡罗鲁"]

上述程序建立了一个包含 "阿莱库斯"、"布莱恩"、"卡罗鲁" 这三个字符串元素的数组, 并把这个数组代入了变量 a 。

要取出数组中对象,如下例所示。

a = ["阿莱库斯","布莱恩","卡罗鲁"]

p a[0] # => "阿莱库斯"
p a[1] # => "布莱恩"
p a[2] # => "卡罗鲁"

上述中,a[0] 和 a[1] 等各个元素,能和其它变量那样单独使用。 这里 0、1、2 那样的数字被称为数组的附加码。 附加码不是从 1 开始而是从 0 开始的,这点一定要注意。 从 0 开始,元素从左至右依次为 0、1、2 ……。

数组中除了字符串外还可以包含其它任意的对象。而且, 使用 p 命令也可以不指定附加码,那样就会显示数组的全部元素。

a = [2000,"阿莱库斯",true,1..50]

p a # => [2000,"阿莱库斯",true,1..50]

数组元素的赋值

数组的各元素的使用和普通的变量一样,也能进行变量的重赋值。

a = [10, 20, 30]
a[0] = 100

p a # => [100, 20, 30]

该示例中,首先是建立了一个由 10、20、30 这三个数字元素组成的数组, 然后向第一个元素里重赋值代入 100。这时 a[0] 原先的数值 10 就被代入的 100 所代替, 显示的结果就更改了。这个处理和普通变量的赋值是一样的。

指定超过最初数组附加码范围的元素并为之赋值,会自动扩大数组添加新的元素。

a = [10, 20, 30]
a[3] = 40

p a # => [10, 20, 30, 40]

建立数组时只有 3 个元素,现在为在其范围外的 a[3] 赋值, 就会自动添加第 4 个元素扩大数组。C 语言等其它语言是不充许这样赋值的, 而 Ruby 这种灵活的语言就可以放心添加。

如果跳过范围的话会如何呢?

a = [10, 20, 30]
a[5] = 60

p a # => [10, 20, 30, nil, nil, 60]

中间就会出现 nil 值。变量这一章的最后有所提及、nil 表示的是「什么都没有」。这个与 true 和 false 等一样是伪变量的一种。和 true 表示「真」,false 表示「伪」一样,nil 表示「无」。

数组的操作

数组是 Array 类的实例。 可以调用这个类定义的方法对数据进行操作。

比如,想知道数组的元素数量的话就可以使用 size 方法。 和 String 类的 size 方法返回字符串字节数相似,Array 类的 size 方法 是返回数组的元素数。数组为空时就返回 0。

a = ["阿莱库斯","布莱恩","卡罗鲁"]

p a.size # => 3

想知道数组中是否含有特定的值的话,就要使用到 include? 方法。

a = ["阿莱库斯","布莱恩","卡罗鲁"]

p a.include?("布莱恩") # => true
p a.include?("迪吉") # => false

第三行中使用 include? 方法,是确认数组中是否含有字符串 "布莱恩"。 上例在第一行生成数组时设有字符串 "布莱恩",所以输出结果为 true(真)。 同样第四行是确认数组中是否含有字符串 "迪吉"。 然而这个字符串在数组中是不存在的,所以输出结果就为 false(伪)。

数组的循环

要对数组进行循环处理,我们会使用一个叫做迭代器的语法。

a = ["阿莱库斯", "布莱恩", "卡罗鲁"]
a.each do |s|
  p s
end

这里使用了变量 s,来输出并循环数组 a 中包含的元素。循环的范围就是 a 中包含的元素,因此以 "阿莱库斯"、"布莱恩"、"卡罗鲁" 的顺序依次输出,此时循环停止。

也就是说,使用 each 方法,可以将 do 和 end 之间的区块对数组 a 的每个元素都执行一遍。

此外,可以用 {...} 来代替 do...end。

a.each {|s| p s }

这一语法可以将循环写在一行里,非常方便。

此处的 do...end 和 {...} 的部分叫做区块

for

像下面这样,使用 for 来进行循环也是可以的。

for s in a
  p s
end

这一形式在 RGSS2 之前常常采用,在 RGSS3 中更推荐迭代器的形式。

Enumerable 模块

Array 类的参考中有一条 「包含的模块」,有一个指向Enumerable 模块的链接。

对象这一章中已经说明,父类的方法可以由子类的对象直接调用。此外,在「包括的模块」中定义的方法也可以直接调用。

返回数组最大值的 max 方法,返回数组最小值的 min 方法使用得尤其频繁。使用方法如下。

a = [30, 75, 12, 9, 58]
p a.max         # => 75
p a.min         # => 9

Enumerable 模块中定义的所有方法,都用到了之前解说过的 each 方法。其中很多方法和 each 一样需要附带一个区块,会有一些难懂。根据需要慢慢记住就可以了。