區塊(Block)主要是以大括號 { } 或 do…end的形式呈現。
在Ruby的世界裡,區塊(Block)並不是一個物件,
所以區塊不能單獨使用,也不能藉由變數指定給他,
而區塊也不是參數。如果硬要寫的話會使語法錯誤,例如:
{puts "Arance"} 或 name = {Arance} 或是
do
puts "Arance"
end
那究竟使用大括號 { } 以及 do…end的差異是什麼呢?
(1)程式碼行數:
如果可以以一行來將程式碼完成時,我們會使用大括號 { };
而如果需要寫至一行以上時(例如遇上比較複雜的判斷時),我們則會使用 do…end。
(2)優先順序:
大括號 { } 優先順序會大於 do…end
例如:
arr = [1, 2, 3]
p arr.map { |x| x+1 } 會得到 [2, 3, 4]
p arr.map do |x| x+1 end 只會得到 [1, 2, 3]
因為優先順序較低的關係,
在這個地方印出東西會先跟陣列先結合,
後面的Block就不會先被處理。
arr = [1, 2, 3]
arr.map { |i| i +1 }
arr.map do |i|
p i+1
end
在Block中以兩個Vertical Bar (|)包住的變數i,
只會在Block內才會有效,如果額外在Block外又以puts i 寫這條程式碼,
會因為找不到這個變數i而出現出錯訊息。
最主要Block中的變數其實就像我們在使用yield(讓)方法,
將目前的控制權轉給Block,而把值帶入Block裡面,
究竟什麼事yield(讓)方法,為何我們需要了解呢?
因為Block不一定能執行,
但我們如果使用yield就一定會執行,會在下一篇介紹yield方法。