2013-03-13 64 views
0

任何人都可以幫助我瞭解以下3種方法關於它們的功能差異和用途?模塊#包含和模塊#擴展和模塊#前置比較討論

  • 模塊#包括mod.included(其他)之後other.include(MOD)稱爲

  • 模塊#擴展mod.extended( obj)obj.extend(mod)

  • 模塊#前置mod.prepended(其他)之後other.prepend(MOD)稱爲

可以將單個例如用於理解上述三個比較?

謝謝

回答

1

在紅寶石。您可以將模塊包含到另一個類中,並且這些方法將可用於該類的實例。擴展類似,除了方法被添加爲類方法。 More info herehere

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。當然,一個新的實例變量,我會添加更多的代碼,但本質上在這裏,您將一段功能提取到可重用模塊中,您可以使用該模塊然後,後來把它分成幾個不同的類。即使您只是將功能添加到單個類中,也可以使用該功能,因爲這樣做的好處是將某個功能提取到單獨的類中,並且您可以更容易理解和調整代碼,如果它與其他功能混合在一起。

+0

感謝您詳細的幫助:) – 2013-03-13 19:10:23

1

Module#prepended很好用Ruby 2.0

Module#included和類似的方式Module#extended工作爲includeextend

下面是在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 extendedextend),當模塊Talker包含在另一個類中時,它會調用。

通過這個功能我們可以擴展原始類的,而不是這種模式:

class Original 
    include Talker 
    extend Talker::ClassMethods 
    ... 
end 
+0

你做的很多..但我的大腦厚,只是想請你,這三個概念可以用一個例子來比較解釋一下嗎? :) – 2013-03-13 18:33:58