包括

2013-12-19 52 views
1

什麼包括

module A 
    def self.included(klass) 
    puts klass 
    end 
end 

module A 
    include ActiveSupport::Concern 
    included do 
    puts self 
    end 
end 

的區別哪一個更好,當使用哪一個?

回答

0

這兩個片段產生相同的結果。但是,有一個小而重要的區別。

第一個代碼是純Ruby。這意味着它將無任何依賴地工作。

第二段代碼依賴於作爲外部依賴項的ActiveSupport。如果你想使用它,你需要在你的項目中包含寶石。在Rails應用程序中,幾乎沒有開銷,因爲應用程序已經依賴於ActiveSupport。但是在非Rails應用程序中,它可能不方便。

此外,ActiveSupport::Concern做的不僅僅是爲Ruby包含的鉤子添加一些語法糖。實際上,這種模塊的主要範圍是管理模塊之間的多個依賴關係。

在Rails代碼庫中,將小塊特性定義到單獨的模塊中是非常常見的。 ActiveSupport本身就是一個很好的例子。但是,您可能會認爲功能A可能需要在模塊B中定義的某些功能,因此如果在代碼中包含B,則該模塊應確保需要並混合A,否則您的代碼將崩潰。

它還基於包含的鉤子實現了一個非常常見的模式:類級別的擴展。下面的Ruby代碼

module A 
    def self.included(base) 
    base.extend ClassMethods 
    end 

    module ClassMethods 
    def bar 
     "bar" 
    end 
    end 
end 

class Foo 
    include A 
end 

Foo.bar 
# => "bar" 

成爲

module A 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def bar 
     "bar" 
    end 
    end 
end 

class Foo 
    include A 
end 

Foo.bar 
# => "bar" 

我個人的建議是避免使用ActiveSupport::Concern如果

  • 你並不需要使用其先進的功能
  • 代碼你正在寫,可以很容易地用幾個代碼編寫而不依賴於Concern
  • 應用程序不包含已作爲ActiveSupport依賴
0

在您的第二段代碼中,在定義A期間0123'被調用一次。除非你定義了included來做某件事,否則它什麼也不做。傳遞給included的數據塊將不起作用,除非您已覆蓋included取得塊並對其執行任何操作。總之,你的第二段代碼沒有意義。

+0

澤感謝您的幫助 – Akshat

+0

但存在的ActiveSupport ::關注,我們可以直接使用方法 – Akshat