1/1页1 跳转到查看:1933
发新话题 回复该主题

Ruby学习总结——数组

Ruby学习总结——数组

Ruby学习总结——数组
2008-08-17
近期在学习Ruby on Rails,写下博客,将我的学习成果供大家分享一下。下面这篇文章是我学习完Ruby中的数组后所做的总结,所用的学习资料是李刚老师的《Ruby on Rails敏捷开发最佳实践》,这本书不错,知识点全面而深入,个人觉得比老外写的书更适合国人阅读。



数组

与其他所有编程语言一样,Ruby也提供了数组。如同所有弱类型的语言一样,Ruby数组里的数据元素类型可以互不相同,而且数组长度也是可变的。



1.定义数组

Ruby中的数组可以使用一系列在方括号中用逗号分隔的对象引用来定义,方括号中的最后一个逗号会被忽略。如下代码所示:

# 定义了一个数组,该数组名为a

a = [4, 5,"hello"]

对于Ruby的数组而言,每个数组元素都处于数组的一个位置上,用一个整数(既可是正整数,也可以是负整数)来索引。数组指定索引的下标用“[ ]”操作符,这实际上也是一个方法,可以在子类中被重载。当我们从左向右访问数组元素时,最左边数组元素的索引从0开始,然后依次是1,2,3,……如果我们希望从右向左访问数组元素,则最右边的数组索引从-1开始,然后依次是-2,-3,-4,……

看如下程序,下面的程序直接创建一个数组之后,又为该数组增加了一个数组元素。

# 定义一个数组

my_array = [3, 4 , "Hello"]

# 输出数组长度

puts "my_array的数组的长度为" + my_array.size.to_s

# 增加一个数组元素

my_array[4] = 3..5

# 输出数组长度

puts "my_array的数组的长度为" + my_array.size.to_s

# 输出所有数组元素

puts my_array

# 从左向右访问数组元素

puts "第三个数组元素是 "  + my_array[2]

print "倒数第一个数组元素是 "

# 从右向左访问数组元素

puts my_array[-1]

运行上面的程序,看到如下的运行结果:

my_array的数组的长度为3

my_array的数组的长度为5

3

4

Hello

nil

3..5

第三个数组元素是 Hello

倒数第一个数组元素是 3..5

从上面的运行结果可以看出:既可以通过正整数索引来访问数组元素,也可以通过负整数索引来访问数组元素。不仅如此,还可以发现Ruby语言里的数组长度是变化的,数组长度总是等于最后一个数组元素的索引加1。

如果我们只指定了数组中某个数组元素的值,则该元素前面没有指定值的数组元素的值都是nil。

Ruby里的数组是Array类的实例,因此,我们还可以通过创建Array类的实例来创建数组。看如下程序,我们通过创建Array类的实例来创建数组。

# 定义一个空数组

my_array = Array.new

puts "数组的长度为 " + my_array.size.to_s

# 为该数组的数组元素指定一个值

my_array[3] = " Hello"

puts "数组的长度为 " + my_array.size.to_s

my_array[5] = 4...7

puts "数组的长度为 " + my_array.size.to_s

# 输出所有数组元素

p my_array

运行上面的程序,看到如下运行结果:

数组的长度为 0

数组的长度为 4

数组的长度为 6

[nil, nil, nil, " Hello", nil, 4...7]

上面的代码示范了通过创建Array的实例来创建数组。直接使用Array.new创建一个空数组,此时该空数组的长度为0,不包含任何数组元素。随着程序为该数组元素指定值,数组长度在不断变化中。

再看如下程序:

# 定义一个空数组

my_array = Array.new

# 当指定正数索引时,数组长度自动加长

my_array[4] = 5;

# 指定负数索引时,该索引必须对应已经存在的数组元素

my_array[-4] = 7;

p my_array

# 下面代码出错,当负数索引超出数组长度时,数组长度不会自动加长

my_array[-7] = "Hello"

当使用my_array[-7] = "Hello"代码为数组元素赋值时,如果该负数索引所对应的数组元素不存在,数组长度不会自动加长。

2.数组的%表示方法

除此之外,Ruby语言还可以把一个包含多个空格的字符串转换成数组。Ruby会把空格当成数组分隔符,每个空格分隔的子串都会被当成一个数组元素。

如果希望将包含多个空格的字符串转换成数组,则需要使用“%w{...}”或者“%W{...}”表示法,这两种表示法的功能大致相同,但“%W{...}”表示法会进行更多额外的替换。看如下程序:

$global = 6

my_array = %w(Hello Ruby On Rails,

    Ruby\ on\ Rails Is Funny! #{$global})

p my_array

my_array2 = %W(Hello Ruby On Rails,

    Ruby\ on\ Rails Is Funny! #{$global})

p my_array2

运行上面的程序,看到如下运行结果:

["Hello", "Ruby", "On", "Rails,", "Ruby on Rails", "Is", "Funny!", "\#{$global}"]

["Hello", "Ruby", "On", "Rails,", "Ruby on Rails", "Is", "Funny!", "6"]

从上面运行结果中可以看出,当使用“%W{...}”表示法时,Ruby会把该字符串中的#{$global}替换成表达式的值,但使用“%w{...}”表示法则不会。

因为Ruby会把字符串中的空格当成数组元素分隔符,如果希望某个数组元素中包含空格,则可以使用反斜线(\)来进行转义,正如上面的程序中看到的效果。



3.数组的常用方法

Ruby的数组是Array类的实例,因此可以使用Array类的实例方法,使用这些方法可以用数组实现队列、堆栈、列表等各种数据结构。

除此之外,数组还包含如下两个常用方法:截取数组的子数组,以及同时为多个数组元素赋值。

下面先看截取数组的子数组的用法,它有三种用法。

array[n , m]:截取数组array的子数组,从索引n开始截取,截取长度为m个元素组成新数组。

array[n .. m]:截取数组array的子数组,从索引n开始截取,截到索引为m的元素(包括索引为m的数组元素)

array[n ... m]:截取数组array的子数组,从索引n开始截取,截到索引为m的元素(不包括索引为m的数组元素)。

# 定义一个Range对象

my_range = 1..9

# 把Range对象转换成数组对象

my_array = my_range.to_a

p my_array

# 从数组的第3个元素开始截取,共截取2个元素

p my_array[2,2]

# 从数组的第3个元素开始截取,截取到第5个元素,包含第5个元素

p my_array[2..4]

# 从数组的第3个元素开始截取,截取到第5个元素,不包含第5个元素

p my_array[2...4]

运行上面的程序,得到如下运行结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

[3, 4]

[3, 4, 5]

[3, 4]

除此之外,还可以同时为多个数组元素赋值,其用法与上面基本类似,一样是通过array[n , m ],array[n .. m ]或者array[n ... m ]三种形式来指定多个数组元素。赋值运算符(=)指定多个值,如果在左边指定的数组元素个数和右边指定的值个数不等,则原数组会自动调整。

看如下程序,下面程序示范了同时为多个数组进行赋值的情况。

# 定义一个Range对象

my_range = 1..9

# 把Range对象转换成数组对象

my_array = my_range.to_a

# 从第3个元素开始,一共将2个元素替换成一个字符串元素

my_array[2,2] = "Ruby"

p my_array

# 从第3个元素开始,一共将1个元素替换成2个元素

my_array[2,1] = ["Hello" , "World"]

p my_array

# 将第3个元素、第4个元素替换成7,8,9三个元素

my_array[2..3] = [7 , 8 , 9]

p my_array

# 从第2个元素开始,一共将6个元素替换成空

my_array[1, 6] = []

p my_array

运行上面的程序,看到如下运行结果:

[1, 2, "Ruby", 5, 6, 7, 8, 9]

[1, 2, "Hello", "World", 5, 6, 7, 8, 9]

[1, 2, 7, 8, 9, 5, 6, 7, 8, 9]

[1, 7, 8, 9]

TOP

 
1/1页1 跳转到
发表新主题 回复该主题