05/02/2010 容器Containers,Blocks, 迭代器Iterators

建立歌曲目录和待播放歌曲的列表,他们都是容器(containers).
容器:是指含有一个或多个对象引用的对象。

目录和播放列表需要一组相似的方法:添加一首歌曲,删除一首歌曲,返回歌曲列表。
播放列表可能还需要执行额外的任务,例如插播广告或者记录累计的播放时间。

开发一个通用的SongList类,然后将其特化(specialize)为目录和播放列表类。

如何在SongList对象中存储歌曲列表?
1)使用Ruby的Array(数组)
2)使用Ruby的Hash(散列表)
3)自定义列表结构

数组类含有一组对象引用。每个对象引用占据数组中的一个位置,并由一个非负的整数索引来标识。
通过使用字面量(literal),或显示的创建Array对象,来创建数组。
字面量数组(literal array)只不过是处于方括号中的一组对象。

1. 使用非负整数访问数组,将会返回处于该整数位置上的对象,如果此位置上没有对象,则返回nil。
1)通过字面量创建数组:
a = [3.14159,“pie”,99]
a.class       --> Array
a.length    --> 3
a[0]           --> 3.14159     
a[1]           --> "pie"
a[2]           --> 99
a[3]           --> nil

2)显示的创建Array对象来创建数组:
b = Array.new
b.class       --> Array
b.length    --> 0
b[0] = "second"
b[1] = "array"
b               -->["second","array"]

注:数组由[ ]操作符来进行索引,它实际上是一个方法(Array类的一个实例方法),因此可以被子类重载。
  数组的下标从0开始。
2. 使用负整数访问数组,则从数组末端开始计数
a = [1,3,5,7,9]
a[-1]   --> 9
a[-2]   --> 7
a[-99]  --> nil

3. 可使用一对数字[start, count]来访问数组,这将返回一个包含从start开始的count个对象引用的新数组。
a = [1, 3, 5, 7, 9]
a[1, 3]       --> [3, 5, 7]  从a[1]开始的,包含有3个对象引用的数组
a[3, 1]       --> [7]  从a[3]开始的,包含有一个对象引用的数组
a[-3, 2]     -->[5, 7] 从a[-3]开始的,包含有2个对象引用的数组

4. 使用range来对数组进行索引,其开始和结束位置被两个或3个点分隔开。
    两个点的形式包含结束位置,3个点的形式不包含。
a = [1, 3, 5, 7, 9]
a[1..3]                     --> [3,5,7]
a[1...3]                    --> [3,5]
a[3..3]                     --> [7]
a[-3..-1]                  --> [5,7,9]

a[-1..-3] 或 a[-3...-3]                 -->无返回值,并不是nil

[ ]操作符有一个相应的[ ] = 操作符,它可以设置数组中的元素,如果下标是单个整数,那么其位置上的元素将被赋值语句右边的东西所替换。

posted @ 2010-05-03 15:51  NikeyL  阅读(188)  评论(0编辑  收藏  举报