数组(array)是一个按顺序保存多个对象的对象,它是基本的容器之一。我们一般称为数组对象或者 Array 对象。

要创建数组,我们需要把各数组的元素用逗号隔开,然后再用 [] 把它们括起来即可。首先,让我们创建一个简单的数组。

names = [" 小林 ", " 林 ", " 高野 ", " 森冈 "]

在这个例子里,我们创建了一个叫 names 的数组对象,分别保存了 4 个数组元素:小林、林、高野、森冈。如图 2.2 所示。

{%}

图 2.2 数组对象

在数组元素对象还未确定的情况下,我们可以用 [] 表示一个空数组对象。

names = []

除此以外,还有其他方法创建数组,我们将会在第 13 章再详细说明。

保存在数组里的每个对象,都各自有一个表示其位置的编号,我们称之为索引(index)。利用索引,我们可以进行把对象保存到数组、从数组中抽取对象等操作。

要从数组中抽取元素(对象),我们可以使用以下方法。

数组名 [ 索引 ]

如下所示,有一个名为 names 的数组对象。

names = [" 小林 ", " 林 ", " 高野 ", " 森冈 "]

names 数组里第一个元素拿出来,我们可以这么做

names[0]

因此,若执行以下代码,

print "第一个名字为:", names[0], "。\n"

得到的结果为,

第一个名字为小林。

同样地,names[1] 表示林,names[2] 表示高野。

执行示例

> irb --simple-prompt
=> names = ["小林", "林", "高野", "森冈"]
=> ["小林", "林", "高野", "森冈"]
>> names[0]
=> "小林"
>> names[1]
=> "林"
>> names[2]
=> "高野"
>> names[3]
=> "森冈"

备注 数组的索引值是从 0 开始,并非 1。因此,a[1]返回的并不是数组第一个元素,而是第二个元素。刚接触编程时,大家比较容易弄错(即便是熟悉以后也有可能会犯这样的错误)。大家在使用数组时,务必注意索引值这个特点。

 

 在 Windows 命令行中,用 Alt + Shift 键切换中英文输入法模式。

我们可以将新的对象保存到已经创建的数组中。

将数组里的某个元素置换为其他对象,我们可以这样做:

数组名 [ 索引 ] = 希望保存的对象

我们试着置换一下刚才的 names 数组的内容,将 " 野尻 " 放在数组首位。

names [0] = "野尻"

执行下面的程序,我们可以知道 " 野尻 " 的确已经被置换为首位的数组元素。

执行示例

> irb --simple-prompt
>> names = ["小林", "林", "高野", "森冈"]
=> ["小林", "林", "高野", "森冈"]
>> names[0] = "野尻"
=> "野尻"
>> names
=> ["野尻", "林", "高野", "森冈"]

在保存对象时,如果指定了数组中不存在的索引值时,则数组的大小会随之而改变。Ruby 数组的大小是按实际情况自动调整的 2

2即动态数组。——译者注

执行示例

> irb --simple-prompt
>> names = ["小林", "林", "高野", "森冈"]
=> ["小林", "林", "高野", "森冈"]
>> names[4] = "野尻"
=> "野尻"
>> names
=> ["小林", "林", "高野", "森冈", "野尻"]

任何对象都可以作为数组元素保存到数组中。例如,我们除了可以创建字符数组,还可以创建数值数组。

num = [3, 1, 4, 1, 5, 9, 2, 6, 5]

Ruby 数组还支持多种不同对象的混合保存。

mixed = [1, " 歌 ", 2, " 风 ", 3]

这里,我们不再举其他例子了,像时间、文件等对象也都可以作为数组元素。

我们可以用 size 方法获知数组的大小。例如,若想获知数组 array 的大小,程序可以这么写:

array.size

我们现在就用 size 方法,查看一下刚才的 names 数组的大小。

执行示例

> irb --simple-prompt
>> names = ["小林", "林", "高野", "森冈"]
=> ["小林", "林", "高野", "森冈"]
>> names.size
=> 4

size 方法的返回值就是数组的大小。

有时,我们希望输出所有数组元素,或者对在数组中符合某条件的元素执行 xx 方法,不符合条件的执行 yy 方法。为实现这些目的,我们需要一种方法遍历所有数组元素。

为此,Ruby 提供了 each 方法。我们在第 1 章介绍迭代器时,已经稍微接触了一下 each 方法。

each 方法的语法如下:

数组 .each do | 变量 |
 希望循环的处理
end

each 后面在 do ~ end 之间的部分称为块(block)3。因此,each 这样的方法也可以称为带块的方法。我们可以把多个需要处理的内容合并后写到块里面。

3也称为代码块。——译者注

块的开始部分为 | 变量 |。each 方法会把数组元素逐个拿出来,赋值给指定的 | 变量 |,那么块里面的方法就可以通过访问该变量,实现循环遍历数组的操作。

接下来,我们实际操作一下,按顺序输出数组 names 的元素。

执行示例

{%}

每循环一次,就会把当前的数组元素赋值给变量 |n|(图 2.3)。

{%}

图 2.3 循环时 n 的变化

除了 each 方法外,数组还提供了许多带块的方法,我们在实际的数组操作中会经常使用到,详细的内容会在 13.6 节介绍。

30:00