上一篇提到過Block不能單獨執行,所以當我們定義一個fix方法後,
呼叫方法之後,後面再使用的Block,會沒有辦法執行,例如:
def fix
puts "fix this thing"
end
fix {
puts "Done!"
}
只會印出 fix this thing,
這邊Block那區的 { puts "Done!" }是不會執行的,
因為Block不能單獨執行。
但當我們使用yield,就可以把控制權讓出來,
當使用yield就一定會執行,我們可以藉由yield把控制權讓給後面的Block,例如:
def fix
puts "fix this thing"
yield
puts "OK!"
end
fix {
puts "Done!"
}
當我們呼叫fix方法時,
會先印出fix this thing,
藉由yield先將控制權給呼叫fix方法時後面的Block 那區的 { puts "Done!" },
所以接下來會印出Done!,
當執行完Block那一區後又會回到fix方法的yield後面,印出OK!。
所以整體會印出:fix this thing,再印出Done!,最後印出OK!。
yield 除了將控制權給Block以外,
如果yield後面接的值,也會一併將值帶入Block內,例如:
def fix
puts "fix this thing"
yield 999
puts "OK!"
end
fix { |x|
puts "Done!This is number #{x}"
}
這裡會將999帶入Block內的x中,
所以整體會印出:fix this thing,
再印出Done!This is number 999,
最後印出OK!。
使用yield後面一定要有Block,
如果沒有Block,會有錯誤訊息,
但如果藉由blockgiven? 使後面不會有錯誤,例如:
def fix
yield if block_given?
end
fix
呼叫fix函數後面沒給定Block就不會有錯誤訊息。
我們可以藉由yield將控制權讓給後面的Block,
也可以將值帶回Block內,
藉由yield將後面那個Block可以使用,
解決了Block不能單獨使用的原則。