数组Arrays
a = [ 3.14159, "pie", 99 ] |
a.type |
? |
Array |
a.length |
? |
3 |
b = Array.new
b[0] = "second" |
b[1] = "array" |
b |
? |
["second", "array"] |
数组指定索引的下标用[ ]操作符,这实际上也是一个方法,可以在子类中被重载。数组索引从0开始,从左向右技术,如果指定的索引为负数,则表示从右边开始计数(这时候最右边的索引下标为-1,不是0)。
a = [ 1, 3, 5, 7, 9 ]
也可以一对数字[start, count]作为下标,这将返回一个数组,包含原数组中从start开始的count个元素。
a[3, 1] |
? |
[7] |
a[-3, 2] |
? |
[5, 7] |
也可以在数组下标中使用Range作为索引。
a[1..3] >> [3, 5, 7]
a[1...3] >> [3, 5]
a[-3..-1] >> [5, 7, 9]
[]操作符对应的有[]=操作符,通过它可以设置数组元素的值。用一个single整数索引,把操作符右边的值赋给该位置的元素。中间所产生的空隙用nil来填补。
a[-3] = 'cat' >> [1, "bat", "cat", 7, 9]
a[3] = [ 9, 8 ] >> [1, "bat", "cat", [9, 8], 9]
a[6] = 99 >> [1, "bat", "cat", [9, 8], 9, nil, 99]
如果[]=的索引有两个数(开始和长度)或者是一个区间,那么在原始数组中的对应元素就会被操作符右边的值代替;如果索引的长度为0,那么右边的值就插入到开始位置前面,不删除元素;如果右边也是一个数组,它的元素代替原始数组的元素;如果索引所选择的元素数目和右边的不一样,那么就自动调整数组的大小来适应。
a = [ 1, 3, 5, 7, 9 ] >> [1, 3, 5, 7, 9]
a[2, 2] = 'cat' >> [1, 3, "cat", 9]
a[2, 0] = 'dog' >> [1, 3, "dog", "cat", 9]
a[1, 1] = [ 9, 8, 7 ] >> [1, 9, 8, 7, "dog", "cat", 9]
a[0..3] = [] >> ["dog", "cat", 9]
a[5] = 99 >> ["dog", "cat", 9, nil, nil, 99]
哈希
可以通过任意类型的对象来索引哈希
h = { 'dog' => 'canine', 'cat' => 'feline', 'donkey' => 'asinine' }
h.length >> 3
h['dog'] >> "canine"
h['cow'] = 'bovine'
h[12] = 'dodecine'
h['cat'] = 99
h >> {"donkey"=>"asinine", "cow"=>"bovine", "dog"=>"canine", 12=>"dodecine", "cat"=>99}
代码块和迭代器
首先,一个代码块出现在一个方法调用的代码附近,代码块和方法的最后一个参数处在同一行;第二,代码块中的代码并不被执行,而是Ruby保存代码块出现时的上下文关系(局部变量、当前对象等等),然后进入到方法中。这正是魅力所在。
在方法中,代码块通过yield语句被调用,这使得代码块就好像是一个方法一样。当yield执行时,它调用代码块中的代码。代码块退出时,控制就马上被返回给yield后面的语句。
def threeTimes yield yield yield end threeTimes { puts "Hello" } |
结果:
|
菲波纳奇数列:
def fibUpTo(max) i1, i2 = 1, 1 # 并行赋值 while i1 <= max yield i1 i1, i2 = i2, i1+i2 end end fibUpTo(1000) { |f| print f, " " } |
结果:
|
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
|