Ruby blocks提供靈活編碼手段
Ruby語言的出現(xiàn),改變了程序員傳統(tǒng)的編寫誒代碼方式,使編程人員在編寫代碼時(shí)會有一種非常愉悅的心情。在這里我們?yōu)榇蠹医榻B一種靈活編碼手段Ruby blocks。#t#
先來看一下這段代碼:
- class SongList
- def [](key)
- return @songs[key] if
key.kind_of?(Integer) - return @songs.find {
|aSong| aSong.name == key } - end
- end
在第四行中,有find這樣一個(gè)方法,可以按照指定條件對songs進(jìn)行遍歷,最終返回一個(gè)符合條件的個(gè)體。
下面就來看看這個(gè)方法到底是怎么實(shí)現(xiàn)的。
- class Array
- def find
- for i in 0size
- value = self[i]
- return value if yield(value)
- end
- return nil
- end
- end
發(fā)現(xiàn)是在Array這個(gè)類中,增加了一個(gè)method,在method中嵌入了一個(gè)遍歷操作。如果只是這樣的話,那么ruby和其他語言也就沒有什么差別了,我們注意到第5行中有yield,這么一個(gè)東東。其實(shí)他起到了一個(gè)代理的作用,實(shí)現(xiàn)了實(shí)際操作部分和遍歷的分離。
再看看下面這個(gè)例子,來了解一下yield的功能。
- 1def threeTimes
- yield
- yield
- yield
- end
- threeTimes { puts "Hello" }
這里定義了名叫threeTimes的blocks, Ruby blocks中會重復(fù)3次外部的操作,當(dāng)row 6的代碼執(zhí)行后,會得到后面的結(jié)果:
Hello
Hello
Hello
可以看到blocks為我們提供了如此靈活的手段,其實(shí)他語言中需要通過代理或接口或函數(shù)指針來實(shí)現(xiàn)。
其實(shí).net 3.x以后的版本也提供了類似的功能,一個(gè)叫LINQ(Language Integrated Query )的東東。
可以使用類似SQL的方式過濾集合
- LINQ Query:
- string[] names = { "Geoff",
"Jessica", "Mike", "Megan",- "Priscilla", "Jack", "Alma" };
- IEnumerable<string> expr =
from s in names- where s.Length == 5
- orderby s
- select s.ToUpper();
- foreach (string item in expr)
- Console.WriteLine(item);
上面的用法是不是很簡潔方便?用ruby來實(shí)現(xiàn)的話,將會是這樣:
- names = [ "Geoff", "Jessica",
"Mike", "Megan", "Priscilla",- "Jack", "Alma" ]
- expr = names.select {
- |n| n.length == 5
- }.sort.collect { |n| n.upcase }
- expr.each {|n| puts n }
正因?yàn)镽uby blocks如此方便,在閱讀ruby程序的時(shí)候,可以看到被廣泛的使用著。