在前面說(shuō)過(guò)的SongList例子中,我們沒(méi)有談到with_title這個(gè)method的實(shí)現,這里要做一下描述:
很直觀(guān)的一種做法就是,盲目搜索,對所有情況進(jìn)行匹配:
class SongList
def with_title(title)
for i in 0...@songs.length #0開(kāi)始,直到小于@songs.length,范圍是[0,@songs.length)
return @songs[i] if title == @songs[i].name
end
return nil
end
end
*在for中,用...(3點(diǎn)),求數組長(cháng)度用length,判斷字符串是不是相等用==,這里和java里面不同的是,==不是用來(lái)判斷2個(gè)class id是不是相當,for循環(huán)使用end結束
我們可以很明顯的感覺(jué)到上面的with_title使用的明顯不是ruby的方式,不夠簡(jiǎn)潔,ruby設計者已經(jīng)考慮到了,array和iterator間的關(guān)系密切,所以為array設置了一個(gè)find這樣的iterator(以前還介紹過(guò)Fixnum class里面的times iterator),下面是更加好的實(shí)現方式:
class SongList
def with_title(title)
@songs.find{|song| song.name == title}
end
end
find這個(gè)iterator,return element,如果沒(méi)有要查找的element,就return nil,yield帶有一個(gè)parameter,表示array里面的elements。
不要從語(yǔ)法上學(xué)習r(shí)uby,這個(gè)是很重要的,因為ruby設計者希望ruby能夠更加自然,更加接近人,所以,這里理解find,是這樣:
find{|element| condition} #element會(huì )從0到最后一個(gè)element,condition包含了判斷這個(gè)element是否合理,假如conditon成立,返回element,否則繼續,直到element被遍歷完成,返回nil
聯(lián)系客服