Blocks:代碼段,使用起來(lái)就像參數(parameters)一樣
先來(lái)說(shuō)說(shuō)Blocks的表現形式:
1.{puts "hi"} #用{}表示Blocks,請在只有一行的時(shí)候使用{}
2.
do
puts "hi"
end #用do...end表示Blocks,多行的時(shí)候使用do...end...
說(shuō)明:實(shí)際上,{}和do...end是一樣的,可以使用在多行,但是ruby的標準,規定,{}用于只有一行的情況,而do...end使用在有多行的情況
使用Blocks:
Blocks使用起來(lái)和parameters一樣,可以這樣用:
1.greet { puts "Hi" } #沒(méi)有parameters的情況
2.verbose_greet("Dave", "loyal customer") { puts "Hi" } #有參數的情況
那Blocks是怎么樣被方法所調用的?方法通過(guò)一個(gè)statement---yield來(lái)調用,例如:
def call_block
puts "Start of method"
yield #yield部分被block代替
yield #1個(gè)method可以有多個(gè)yield
puts "End of method"
end
call_block { puts "In the block" }
produces:
Start of method
In the block
In the block
End of method
yield:
yield是一個(gè)statement,而不是method
yield可以帶parameters(此說(shuō)法來(lái)源于《programming ruby》),比如:yield("hi",123),一個(gè)更加具體的例子:
#本代碼模擬times
def mytimes p
i=0
while i <= p
yield(i)
i = i+1
end
end
mytimes(3){|i| p i} #p 是一個(gè)類(lèi)似于print,puts的打印的method
結果:
0
1
2
3
上面的代碼說(shuō)明:yield的parameter,傳遞給了block里面對應的variable,block在利用variable進(jìn)行有關(guān)操作。也許這一切有點(diǎn)難以理解,你可以想象block就是一個(gè)方法,它可以接受parameters,而|i|就是對參數的聲明,yield會(huì )把自己的parameters傳遞到block里面。
*假如我們在方法里面放入了yield,但是在調用的時(shí)候沒(méi)有使用block會(huì )是什么樣的?允許嗎?
例如:
def mytimes p
i=0
while i <= p
yield(i)
i = i+1
end
end
mytimes(3) #不使用block
結果:
4:in `mytimes‘: no block given (LocalJumpError)
from a.rb:9
所以,在使用了yields的情況下面,必須使用blocks
另外一個(gè)問(wèn)題出來(lái)了,假如是yield帶有參數,block卻沒(méi)有對應的參數,會(huì )怎么樣?
例如:
def mytimes p
i=0
while i <= p
yield(i)
i = i+1
end
end
mytimes(3){} #無(wú)參數
結果:
#一個(gè)空白行,可以運行
再看:
def mytimes p
i=0
while i <= p
yield(i)
i = i+1
end
end
mytimes(3){|a,b| p a} #帶有2個(gè)參數
結果:
0
1
2
3
繼續看:
def mytimes p
i=0
while i <= p
yield(i)
i = i+1
end
end
mytimes(3){|a,b| p b} #這次打印 b
結果:
nil
nil
nil
nil
我想讀者應該知道了吧,總結一下:出現yield就必須使用block,但是block和yield的parameters不一定要匹配,blocks中variable的初值是nil
iterators:(迭代器)
iterators是一種method,object of collections 可以使用它,collections在A(yíng)rrays and Hashes里面已經(jīng)提到,最常見(jiàn)的就是Arrays and Hashes了,我們可以形象的認為他們的關(guān)系是:collection.literator,舉例:
animals = %w( ant bee cat dog elk ) # create an array
animals.each {|animal| puts animal } # iterate over the contents
each就是一個(gè)iterator,它是class Array 的一個(gè)方法
下面舉例來(lái)說(shuō)說(shuō)各種iterators:
[ ‘cat‘, ‘dog‘, ‘horse‘ ].each {|name| print name, " " } #這里有點(diǎn)要注意的就是,print后面可以接多個(gè)parameters,同樣的p,puts都可以
5.times { print "*" }
5.times {|i| p i} # Fixnum 類(lèi)的 iterators:times
3.upto(6) {|i| print i } # Fixnum 類(lèi)的 iteratros:upto
(‘a(chǎn)‘..‘e‘).each {|char| print char } # Range 類(lèi)的 iterators:each,Range也是一個(gè)collections,each在所有collections里都有定義
Range 類(lèi):表現形式,(1..9),(‘a(chǎn)‘..‘k‘)
| 符號 | 意義 |
| ( ) | Ranges |
| [ ] | Arrays |
| {} | Hashes |
| %w() %w[] %w{} | Arrays |
聯(lián)系客服