2015-04-07 53 views
0

我是Ruby新手。我的東西弄得我讀這裏:在Ruby中,爲什麼在你正在創建的調用中包裝「yield」?

http://alma-connect.github.io/techblog/2014/03/rails-pub-sub.html

他們提供了這樣的代碼:

# app/pub_sub/publisher.rb 
module Publisher 
    extend self 

    # delegate to ActiveSupport::Notifications.instrument 
    def broadcast_event(event_name, payload={}) 
    if block_given? 
     ActiveSupport::Notifications.instrument(event_name, payload) do 
     yield 
     end 
    else 
     ActiveSupport::Notifications.instrument(event_name, payload) 
    end 
    end 
end 

是什麼這樣的區別:

ActiveSupport::Notifications.instrument(event_name, payload) do 
    yield 
end 

對這樣做:

ActiveSupport::Notifications.instrument(event_name, payload) 
yield 

如果這是另一種語言,我可能會假設我們首先調用方法instrument(),然後調用yield來調用該塊。但這不是他們寫的。他們顯示收益率嵌套在ActiveSupport::Notifications.instrument()之內。

我應該假設ActiveSupport::Notifications.instrument()正在返回某種迭代,我們將迭代?對於從ActiveSupport::Notifications.instrument()返回的每件商品,我們是否要求退貨一次?

回答

0

儘管塊經常用於迭代,但它們還有許多其他用途。之一是確保適當的資源清理,例如

ActiveRecord::Base.with_connection do 
    ... 
end 

檢查出的螺紋的數據庫連接,收率到塊,然後檢查連接回。

在儀器方法的特定情況下您發現它所添加的事件數據即將廣播有關塊執行時間的信息。實際的實現更復雜,但概括而言它不是那麼不同,以

event = Event.new(event_name, payload) 
event.start = Time.now 
yield 
event.end = Time.now 
event 

運用收益率允許它與一些計時代碼包裝你的代碼的執行。在第二個示例中,沒有任何塊會傳遞到instrument,該塊會檢測到該塊並將其記錄爲沒有持續時間的事件

0

broadcast_event方法已被設計爲接受可選的block(它允許您傳遞一個代碼塊的方法)。

ActiveSupport::Notifications.instrument也需要一個可選塊。

您的第一個示例只是將傳入的塊傳遞給broadcast_event並將其轉發給ActiveSupport::Notifications.instrument。如果沒有阻止,你不能yield什麼,因此不同的呼叫。

相關問題