iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0
自我挑戰組

今晚我想來點 Ruby on Rails 系列 第 20

<Day 20>什麼是 Yield & Yield_Self

  • 分享至 

  • xImage
  •  

“yield” 在 ruby 裡代表什麼?又做了什麼事?

Yield 是一個關鍵字,可以在方法裡面使用去呼叫一個 block,呼叫後會執行 block 裡的程式碼(就像是呼叫一個方法),Yield 可以傳任何的參數給 block ,而 block 的回傳值就會是 yield 的回傳值。

可以想像成 block 就是一個沒有名稱的方法,可以傳額外的參數給其他的方法。

def make_salad
  yield "lettuce"
  yield "carrots"
  yield "olive oil"
end

make_salad { |ingredient| puts "Adding #{ingredient} to salad!" }

這裡呼叫了 block 三次

Adding lettuce to salad!
Adding carrots to salad!
Adding olive oil to salad!

看起來就像是呼叫一個方法,但其事實呼叫一個 block。

現在來看看,如果沒有 block 可以呼叫的狀況,如果你呼叫 yield 卻沒有 block,那就會得到一個錯誤訊息。

def write_code
  yield
end
write_code
# LocalJumpError: no block given (yield)

這裡的錯誤很明顯,沒有給 block 。那如何預防這個錯誤?

def write_code
  yield if block_given?
end

使用 The block_given? 方法去檢查是否有 block 當有的時候才會執行。

為什麼要使用 Yield?

使用 yield 來執行 blocks.

使用 block 來傳一些程式碼,就像傳程式碼給方法一樣。在某些狀況下是有用的。當要寫一個 logging function , logs 需要花一些時間跑,想要在方法跑完的時候執行一個程式碼(像是 JS 裡面的 “callbacks”),想要 “lazy code”,程式碼只會在需要的時候執行而自己可以客製化。

Yield_Self – 有什麼不同?

或許已經發現了新的 yield_self 方法,看起來好像跟 yield 有什麼關係,其實並沒有。因為 self 會參照到當前的物件。在任何想要使用的地方把方法串起來,對使用 yield_self 方法呼叫的物件做一些事情。

n_squared = ->(n) { n ** 2 }
2
.yield_self(&n_squared)
.yield_self(&n_squared)
# 16

不要跟一般的 yield 搞混了。


上一篇
<Day 19>在 ruby 的世界裡“繼承”是什麼意思?
下一篇
<Day 21>如何使用 Logs 來追蹤事件跟錯誤訊息
系列文
今晚我想來點 Ruby on Rails 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言