ruby系列教材(23):Blocks and Iterators
上一篇 /
下一篇 2008-02-02 15:25:08
/ 个人分类:Ruby
在前面说过的SongList例子中,我们没有谈到with_title这个method的实现,这里要做一下描述:
很直观的一种做法就是,盲目搜索,对所有情况进行匹配:
class SongList
def with_title(title)
for i in0...@songs.length #0开始,直到小于@songs.length,范围是[0,@songs.length)
return @songs[i] if title == @songs[i].name
end
return nil
end
end
*在for中,用...(3点),求数组长度用length,判断字符串是不是相等用==,这里和java里面不同的是,==不是用来判断2个class id是不是相当,for循环使用end结束
我们可以很明显的感觉到上面的with_title使用的明显不是ruby的方式,不够简洁,ruby设计者已经考虑到了,array和iterator间的关系密切,所以为array设置了一个find这样的iterator(以前还介绍过Fixnum class里面的times iterator),下面是更加好的实现方式:
class SongList
def with_title(title)
@songs.find{|song| song.name == title}
end
end
find这个iterator,return element,如果没有要查找的element,就return nil,yield带有一个parameter,表示array里面的elements。
不要从语法上学习ruby,这个是很重要的,因为ruby设计者希望ruby能够更加自然,更加接近人,所以,这里理解find,是这样:
find{|element| condition} #element会从0到最后一个element,condition包含了判断这个element是否合理,假如conditon成立,返回element,否则继续,直到element被遍历完成,返回nil
相关阅读:
- YAML使用基础 (snake007008009, 2008-2-02)
- 理解Symbol (snake007008009, 2008-2-02)
- Rails 基础指南 (snake007008009, 2008-2-02)
- ruby系列教材(16):Singletons and Other Constructors (snake007008009, 2008-2-02)
- ruby系列教材(17):Access Control (snake007008009, 2008-2-02)
- ruby系列教材(18):Specifying Access Control (snake007008009, 2008-2-02)
- ruby系列教材(19):Variables (snake007008009, 2008-2-02)
- ruby系列教材(20):Arrays (snake007008009, 2008-2-02)
- ruby系列教材(21):Hashes (snake007008009, 2008-2-02)
- ruby系列教材(22):Implementing SongList (snake007008009, 2008-2-02)
收藏
举报
TAG:
Ruby