什麼包括
module A
def self.included(klass)
puts klass
end
end
和
module A
include ActiveSupport::Concern
included do
puts self
end
end
的區別哪一個更好,當使用哪一個?
什麼包括
module A
def self.included(klass)
puts klass
end
end
和
module A
include ActiveSupport::Concern
included do
puts self
end
end
的區別哪一個更好,當使用哪一個?
這兩個片段產生相同的結果。但是,有一個小而重要的區別。
第一個代碼是純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
依賴在您的第二段代碼中,在定義A
期間0123'被調用一次。除非你定義了included
來做某件事,否則它什麼也不做。傳遞給included
的數據塊將不起作用,除非您已覆蓋included
取得塊並對其執行任何操作。總之,你的第二段代碼沒有意義。
澤感謝您的幫助 – Akshat
但存在的ActiveSupport ::關注,我們可以直接使用方法 – Akshat