博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

sislcb

寻找自己
sislcb.cublog.cn
Programming Ruby--容器,块( Blocks)和迭代器( Iterator)

容器

数组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 ]
a[-2] ? 7
a[-99] ? nil

也可以一对数字[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" }


 
结果: 

Hello
Hello
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

 

发表于: 2007-08-15,修改于: 2007-08-16 14:16,已浏览420次,有评论0条 推荐 投诉

给我留言
版权所有 ChinaUnix.net 页面生成时间:0.10129