Ruby 裡,幾乎什麼東西都是物件,但其實還是有少數的例外,例如 Block 程式碼區塊, block 是 Ruby 中的一種程式碼結構,可以被視為一組相關的程式碼,它們可以被重複使用並在不同的上下文中執行。 Ruby 的 block 通常包含在 {}
或 do...end
中,可以在方法調用時傳遞給方法,也可以與迭代器一起使用,簡單來說 block 是一段不會被主動執行的程式碼。
使用 yield
方法,暫時把控制權交棒給 Block,等 Block 執行結束後再把控制權交回來:
def add(a, b)
result = a + b
yield(result) if block_given?
result
end
sum = add(3, 5) do |result|
puts "計算結果是 #{result}"
end
puts "總和是 #{sum}"
在上述的例子中,我們印出了計算結果,在這種情況下,yield 將控制權轉讓給程式區塊,並在程式區塊執行完畢後將控制權返回到 add 方法,最後返回計算的總和。
def greet(name)
puts "Hello, #{name}!"
yield(name)
puts "Goodbye, #{name}!"
end
greet("Luffy") do |name|
puts "Nice to meet you, #{name}!"
end
大括號的結合率會比 do ... end 強
list = [1, 2, 3, 4, 5]
p list.map { |item|
item * 2
}
# 印出 [2, 4, 6, 8, 10]
p list.map do |item|
item * 2
end
# 印出 <Enumerator: [1, 2, 3, 4, 5]:map>
雖然 Block 沒辦法單獨存活 但被物件化之後就可以了,物件化程式區塊:Proc
和 Lambda
my_proc = Proc.new { puts "Hello from Proc!" }
my_proc.call # 印出 Hello from Proc!
常見呼叫proc的方法
square = Proc.new { |n| n * n }
p square.call(5) # 印出 25
p square[5]
p square.(5)
p square.===5
lambda 寫法跟proc非常相似
square = lambda { |n| n * n }
# 等同上面 square = ->(n) { n * n }
p square.call(5) # 印出 25
p square[5]
p square.(5)
p square.===5
square = Proc.new { |n| n * n }
p square.call(5, 3) # 印出 25
square = lambda { |n| n * n }
p square.call(5, 3) # 發生引數個數錯誤
Day 10 預計來介紹物件導向程式設計,我們明天見!