今天我們來看看 ruby 裡面的 block。
大家熟知的在 Ruby 裡面幾乎所有東西都是物件,但還是有少數的例外,Block 就不是物件。因此 Block 沒有辦法單獨的存在,也沒辦法把它指定給某個變數,像這樣的寫法都會造成語法錯誤(Syntax Error):
## 語法錯誤
{ puts "Hello, World" }
action = { puts "Hello, World" }
block 是包含程式碼的匿名函數,他可以傳遞給其他方法當作參數。
在 Ruby 裡面我們可以使用 {}、do...end 來定義 block
# 使用 {}
do_something { |param| puts param }
# 使用 do...end
do_something do |param|
puts param
end
Ruby 可以接受一個或多個 block 作為參數,可以使用 yield 來傳遞參數給 blok
def my_method
yield("Hello, world!")
end
my_method { |message| puts message }
## 輸出 "Hello, world"
在方法定義當中,我們可以使用 &block 來接受 blcok 做為一個參數。
def my_method(&block)
block.call("Hello, block!")
end
my_method { |message| puts message }
## 輸出 "Hello, block!"
Block 可以被轉換為 Proc 對象,使得我們可以儲存、重複使用、傳遞 block。
my_proc = Proc.new { |x| x * 2 }
puts my_proc.call(3) # 輸出 6
在 Block 的最後一行的執行結果會自動變成 Block 的回傳值
def my_method
result = yield
puts "Block回傳值:#{result}"
end
my_method do
5 + 3 # block的最後一行,回傳 8
end
這樣對 Block 有沒有更了解了呢?
明天來介紹 Lambda、Proc。