在前面說過的SongList例子中,我們沒有談到with_title這個method的實現(xiàn),這里要做一下描述:
很直觀的一種做法就是,盲目搜索,對所有情況進(jìn)行匹配:
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點),求數(shù)組長度用length,判斷字符串是不是相等用==,這里和java里面不同的是,==不是用來判斷2個class id是不是相當(dāng),for循環(huán)使用end結(jié)束
我們可以很明顯的感覺到上面的with_title使用的明顯不是ruby的方式,不夠簡潔,ruby設(shè)計者已經(jīng)考慮到了,array和iterator間的關(guān)系密切,所以為array設(shè)置了一個find這樣的iterator(以前還介紹過Fixnum class里面的times iterator),下面是更加好的實現(xiàn)方式:
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。
不要從語法上學(xué)習(xí)ruby,這個是很重要的,因為ruby設(shè)計者希望ruby能夠更加自然,更加接近人,所以,這里理解find,是這樣:
find{|element| condition} #element會從0到最后一個element,condition包含了判斷這個element是否合理,假如conditon成立,返回element,否則繼續(xù),直到element被遍歷完成,返回nil