RUBY
文档中心
6,容器,代码块,迭代器 ,容器, 码块, 一个只有一首歌曲的点唱机很少见(除非在非常非常特殊的场合),所以不久我们就开始考虑制作一个歌单和 播放列表.它们两个都是容器:用来保存对一个或者多个对象的引用的对象.
歌单和播放列表有一些相似的方法:添加一首歌,删除一首歌,返回一个歌曲列表等等.播放列表还应该增加 一些其它的功能,比如每次播放时插入广告,记录累计播放时间等.不过我们先不去考虑这些问题,现在最好 先创建一个通用的 SongList 类供歌单和播放列表使用. 容器 在实现以前,我们需要决定怎样在 SongList 对象中储存歌曲列表,有三种方法,使用 Ruby 的 Array 类型或者 Hash 类型,要不然就自己做一个列表结构.偷懒的结果就是先来看看数组和哈希,从中选择一个用在我们的 类中. 数组 Array 类保存着对象引用的集合.每一个对象的引用在数组中都有一个位置,通过一个非负整数来索引. 你可以使用字面值或者直接生成一个 Array 对象,一个字面上的数组是被方括号括住的一个对象序列.
a = [ 3.14159, "pie", 99 ] a.type a.length a[0] a[1] a[2] a[3] >> >> >> >> >> >> Array 3 3.14159 "pie" 99 nil
b = Array.new b.type b.length >> >> Array 0
b[0] = "second" b[1] = "array" b >> ["second", "array"]
数组通过[]操作符来索引,就像大多数的 Ruby 操作符,这实际上也是一个方法(在 Array 类中)所以也可以在 子类中重载,如例中所示数组索引从 0 开始.使用一个 single 整数来索引数组,返回该位置的对象,如果在那 个位置没有对象则返回 nil.如果使用一个负整数索引数组,那么它从数组尾端返回,参看 35 页的表 4.1.
a = [ 1, 3, 5, 7, 9 ] a[-1] a[-2] a[-99] >> >> >> 9 7 nil
也可以使用一对数字来索引数组,[start,count].这会返回一个新数组,它由从 start 开始的 count 个对象的引 用组成.
a = [ 1, 3, 5, 7, 9 ] a[1, 3] a[3, 1] a[-3, 2] >> >> >> [3, 5, 7] [7] [5, 7]
(译者注:注意负整数索引的方向依然是从前向后)
最后你也可以使用区间来索引数组,开始和结束位置之间插入两个或者三个点,两个点的形式表示包含结束 位置,三个点不包含.
a = [ 1, 3, 5, 7, 9 ] a[1..3] a[1...3] a[3..3] a[-3..-1] >> >> >> >> [3, 5, 7] [3, 5] [7] [5, 7, 9]
[]操作符对应的有[]=操作符,通过它可以设置数组元素的值.用一个 single 整数索引,把操作符右边的值赋给 该位置的元素.中间所产生的空隙用 nil 来填补.
a = [ 1, 3, 5, 7, 9 ] a[1] = 'bat' a[-3] = 'cat' a[3] = [ 9, 8 ] a[6] = 99
>> >> >> >> >>
[1, 3, 5, 7, 9] [1, "bat", 5, 7, 9] [1, "bat", "cat", 7, 9] [1, "bat", "cat", [9, 8], 9] [1, "bat", "cat", [9, 8], 9, nil, 99]
如果[]=的索引有两个数(开始和长度)或者是一个区间,那么在原始数组中的对应元素就会被操作符右边的值 代替;如果
索引的长度为 0,那么右边的值就插入到开始位置前面,不删除元素;如果右边也是一个数组,它的 元素代替原始数组的元素;如果索引所选择的元素数目和右边的不一样,那么就自动调整数组的大小来适应.
(译者注:值得一提的是如果出现了空隙,依旧用 nil 来填补)
a = [ 1, 3, 5, 7, 9 ] a[2, 2] = 'cat' a[2, 0] = 'dog' a[1, 1] = [ 9, 8, 7 ] a[0..3] = [] a[5] = 99
>> >> >> >> >> >>
[1, 3, 5, 7, 9] [1, 3, "cat", 9] [1, 3, "dog", "cat", 9] [1, 9, 8, 7, "dog", "cat", 9] ["dog", "cat", 9] ["dog", "cat", 9, nil, nil, 99]
数组有大量有用的方法,通过它们你可以把数阻当成堆,栈,集,队列,双列,先入先出列等.278 页有完整的 数组方法列表.
哈希
哈希(有时被认为是数组和字典的结合)和数组一样是用来储存对象引用的集合.
不过,区别于通过整数来索引数组,你可以通过任意类型的对象来索引哈希:字符,正则表达式等.在哈希中 保存元素实际上是保存了两个对象----键和值.用键可以索引到对应的值.哈希中的值可以是任意类型的对 象,下面的例子使用了哈希字面值:括号括起来的键值对.
h = { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' }
h.length h['dog'