在前面说过的SongList例子中,我们没有谈到with_title这个method的实现,这里要做一下描述:
很直观的一种做法就是,盲目搜索,对所有情况进行匹配:
class SongList
def with_title(title)
for i in 0...@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
联系客服