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