任何人都可以幫助我瞭解以下3種方法關於它們的功能差異和用途?模塊#包含和模塊#擴展和模塊#前置比較討論
模塊#包括:mod.included(其他)之後other.include(MOD)稱爲
模塊#擴展:mod.extended( obj)obj.extend(mod)
模塊#前置:mod.prepended(其他)之後other.prepend(MOD)稱爲
可以將單個例如用於理解上述三個比較?
謝謝
任何人都可以幫助我瞭解以下3種方法關於它們的功能差異和用途?模塊#包含和模塊#擴展和模塊#前置比較討論
模塊#包括:mod.included(其他)之後other.include(MOD)稱爲
模塊#擴展:mod.extended( obj)obj.extend(mod)
模塊#前置:mod.prepended(其他)之後other.prepend(MOD)稱爲
可以將單個例如用於理解上述三個比較?
謝謝
在紅寶石。您可以將模塊包含到另一個類中,並且這些方法將可用於該類的實例。擴展類似,除了方法被添加爲類方法。 More info here或here。
Prepend是一個新的2.0功能。 「有時候,你需要一個模塊中的方法來優先考慮來自類的方法,有一些解決方案可以完成這個任務,比如alias_method_chain,但它比任何東西都更加黑客 - 而且並不安全。」 - 也就是說,您有時希望將包含的方法放在類中的方法之前,然後可以使用super
來調用該類中的原始方法。
這兩個鏈接都有詳細的例子,所以一定要檢查一下。但是,對於包含什麼,預先使用和擴展使用?那麼,在你想要包含/擴展/前綴的模塊上,你可以定義這些函數,並且當實際的包含/擴展/預先發生時,這個方法將被調用,obj
參數被設置爲你正在擴展的類。例如,當你不想僅向類中添加方法,但想要向其中添加類變量或實例變量,或初始化值......無盡的可能性時,這很有用。
例
比方說,我有一大堆的模型,如評論,帖子,圖片等,而不必執行例如像功能的能力,複製和粘貼相同的代碼「像「的東西,我可以代替創建這樣的事情:
module Likable
def self.included(obj)
obj.instance_variable_set(:@like_count, 0)
end
end
class Comment
include Likable
end
class Picture
include Likable
end
正如你所看到的,這會自動將稱爲like_count
爲0。當然,一個新的實例變量,我會添加更多的代碼,但本質上在這裏,您將一段功能提取到可重用模塊中,您可以使用該模塊然後,後來把它分成幾個不同的類。即使您只是將功能添加到單個類中,也可以使用該功能,因爲這樣做的好處是將某個功能提取到單獨的類中,並且您可以更容易理解和調整代碼,如果它與其他功能混合在一起。
Module#prepended
很好用Ruby 2.0
Module#included
和類似的方式Module#extended
工作爲include
和extend
下面是在Rails項目使用了流行的模式與其他新功能描述here沿:
module Talker
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def say(*args)
args.each do |arg|
method_name = ("say_" + arg.to_s).to_sym
send :define_method, method_name do
puts arg
end
end
end
end
end
included
掛鉤include
event(sam e extended
extend
),當模塊Talker
包含在另一個類中時,它會調用。
通過這個功能我們可以擴展原始類的,而不是這種模式:
class Original
include Talker
extend Talker::ClassMethods
...
end
你做的很多..但我的大腦厚,只是想請你,這三個概念可以用一個例子來比較解釋一下嗎? :) – 2013-03-13 18:33:58
感謝您詳細的幫助:) – 2013-03-13 19:10:23