• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ruby中的blocks和iterators

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
在前面的一篇blog中,使用到了这样的代码
1class SongList
2  def [](key)
3    return @songs[keyif key.kind_of?(Integer)
4    return @songs.find { |aSong| aSong.name == key }
5  end
6end

在第四行中,有find这样一个方法,可以按照指定条件对songs进行遍历,最终返回一个符合条件的个体。

下面就来看看这个方法到底是怎么实现的,
 1class Array  
 2  def find  
 3    for i in 0size  
 4      value = self[i]  
 5      return value if yield(value)  
 6    end  
 7    return nil  
 8  end  
 9end  
10
发现是在Array这个类中,增加了一个method,在method中嵌入了一个遍历操作。
如果只是这样的话,那么ruby和其他语言也就没有什么差别了,我们注意到第5行中有yield
这么一个东东。其实他起到了一个代理的作用,实现了实际操作部分和遍历的分离。

再看看下面这个例子,来了解一下yield的功能。
1def threeTimes
2  yield
3  yield
4  yield
5end
6threeTimes { puts "Hello" }
7
8

这里定义了名叫threeTimes的blocks, blocks中会重复3次外部的操作,当row 6的代码执行后,会得到后面的结果:
Hello
Hello
Hello

可以看到blocks为我们提供了如此灵活的手段,其实他语言中需要通过代理或接口或函数指针来实现。
其实.net 3.x以后的版本也提供了类似的功能,一个叫LINQ(Language Integrated Query )的东东。
可以使用类似SQL的方式过滤集合

LINQ Query:

上面的用法是不是很简洁方便?

用ruby来实现的话,将会是这样:

1names = [ "Geoff", "Jessica", "Mike", "Megan", "Priscilla",
2             "Jack", "Alma" ]
3             
4expr = names.select {
5    |n| n.length == 5
6}.sort.collect { |n| n.upcase }
7
8expr.each {|n| puts n }

正因为blocks如此方便,在阅读ruby程序的时候,可以看到被广泛的使用着。



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ruby语言开源Web应用框架 Ruby on Rails 简介发布时间:2022-07-14
下一篇:
[Ruby]$:是什么意思?发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap