over 4 years ago

yield 關鍵字

根據RUBY FOR RAILS的說法
如果你在呼叫函式的同時提供一段程式碼, 那麼在函式中, 你可以代入yield這段程式碼。在呼叫關鍵字yield之後,
暫時中段原本函式的執行, 先執行這段程式碼, 然後再把控制權交還給函式。

...喔...看起來很玄...有看沒有懂=_=


yield這個字在ruby看起來真的很玄...連網路上的講法也都很玄
我就已目前的理解來整理一下吧!
首先在rails new一個專案的時候會在app/views/layouts/application.html.erb看到

application.html.erb
  <html>
  <head></head>
  <body>
    <%= yield %>
  </body>
  </html>

居然連yield都是一個rails的基本款語法, 開接觸RoR的時候真直接把它當作看不見, 因為看不懂...
簡單來說, 程式碼都是由上往下執行, html也不例外,
當layout執行執行執行...執行到yield的關鍵字的時候
會先中斷layout的程式,
跑去執行controller/view最後所產生的結果回傳到layout中,
再回來繼續執行layoutyield下面的html/code

yield是不是很玄呀XD

那什麼情況下會用到?

當我們有一段function/method要這樣寫

posts_controller.rb
  def show
    start_time = Time.now
    @post = Post.find(params[:id])
    logger.error("#{params[:controller]}-#{params[:action]} spent:#{start_time-Time.now}s")
  end

那我們可以把@post = Post.find(params[:id])上下那兩段code做包裝的動作

tool.rb
  module Tool
    def compute_time
      start_time = Time.now
      yield
      logger.error("#{params[:controller]}-#{params[:action]} spent:#{start_time-Time.now}s")
    end
  end
posts_controller.rb
  include Tool
  def show
    compute_time do
      @post = Post.find(params[:id])
    end
  end

如此一來我們想在compute_time這個function怎麼亂搞就怎麼亂搞了XD
當然yield還可以做很多一般人做不到的事 ㄎㄎ 這就要看功力囉~

← OS X Iion 安裝筆記 ubuntu12.04+rvm+passenger+nginx →