almost 4 years ago
Yield

Yield的概念其實就是block.call,把block裡的內容帶到method中。

快速看以下例子就可以瞭解。

def call_this_block_twice
  yield
  yield
end

call_this_block_twice { puts "twitter" }

#result

"twitter"
"twitter"

當call_this_block_twice加上了{ puts "twitter" } 後,這個block就會被傳遞到method裡。

Yield也可以使用變數
def call_this_block
  arg = "twitter"
  yield arg
end

call_this_block { |arg| puts arg } 

#result

"twitter"

call_this_block { |arg| arg.upcase }

#result

"TWITTER"

加上變數後,block在被呼叫的時候就可以使用這個變數。

Yield也可以直接回傳value
def puts_this_block
  puts yield
end

puts_this_block { "twitter" }

#result

"twitter"

block裡即使只有純文字,也會被傳遞到yield。

利用yield讓code變得更簡潔
class Timeline
    def list_tweets
      @user.friends.each do |friend|
        friend.tweets.each { |tweet| puts tweet }
      end
    end
      
    def store_tweets
      @user.friends.each do |friend|
        friend.tweets.each { |tweet| tweet.cache }
      end
    end
end

list_tweets 和 store_tweets的code幾乎一模一樣,用yield可以做的更漂亮

class Timeline
  def each
    @user.friends.each do |friend|
      friend.tweets.each { |tweet| yield tweet }
    end
  end
end
    
timeline = Timeline.new(user)
timeline.each { |tweet| puts tweet }
timeline.each { |tweet| tweet.cache }
← Include vs. Extend What Is Proc →
 
comments powered by Disqus