iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
Software Development

Zero to Ruby on Rails系列 第 9

Day 09 - Block 程式碼區塊

  • 分享至 

  • xImage
  •  

Ruby 裡,幾乎什麼東西都是物件,但其實還是有少數的例外,例如 Block 程式碼區塊, block 是 Ruby 中的一種程式碼結構,可以被視為一組相關的程式碼,它們可以被重複使用並在不同的上下文中執行。 Ruby 的 block 通常包含在 {}do...end 中,可以在方法調用時傳遞給方法,也可以與迭代器一起使用,簡單來說 block 是一段不會被主動執行的程式碼。

執行 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 方法,最後返回計算的總和。

傳遞參數給 yield

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 區別

大括號的結合率會比 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 物件化

雖然 Block 沒辦法單獨存活 但被物件化之後就可以了,物件化程式區塊:ProcLambda

Proc

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 λ

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

Proc and Lambda 差異?

square = Proc.new { |n| n * n }

p square.call(5, 3) # 印出 25



square = lambda { |n| n * n }

p square.call(5, 3) # 發生引數個數錯誤

預告

Day 10 預計來介紹物件導向程式設計,我們明天見!


上一篇
Day 08 - Loop and Iteration 迴圈與迭代
下一篇
Day 10 - Object-Oriented Programming - part 1 物件導向程式設計(一)
系列文
Zero to Ruby on Rails30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言