2016-12-07 59 views
-1

我想了解在類中包含或繼承模塊的概念。每當我閱讀時,我都會得到新的方法來在課堂中包含或繼承一個模塊。所以只想知道有多少種方式。下面是實施例中,我共享:在類中包含或繼承模塊的方法

實施例1

module TimeExtensions 
    refine Fixnum do 
    def minutes; self * 60; end 
    end 
end 

class MyApp 
    using TimeExtensions 

    def initialize 
    p 2.minutes 
    end 
end 

實施例2

VAL = 'Global' 

module Foo 
    VAL = 'Foo Local' 

    class Bar 
    def value1 
     VAL 
    end 
    end 
end 

class Foo::Bar 
    def value2 
    VAL 
    end 
end 

實施例3

module Foo 
    def foo 
    puts 'heyyyyoooo!' 
    end 
end 

class Bar 
    include Foo 
end 
+0

這三個例子做了非常不同的事情。你可以問這三者之間有什麼區別。另一方面,如果你只是想要不同的語法,你可以得到很多,但是有什麼意義呢? – ndn

+0

我正在學習如何在課堂中包含一個模塊。每當我看到我得到一個不同的方式。所以我的問題是爲什麼有3種方法做一個小東西.. – ankur

+0

http:// ruby​​-doc .org/core-2.0.0/Module.html#method-i-prepend是另一種可能性。 –

回答

1

在三個中,只有最後一個包含一個模塊。也就是說,它將模塊中的方法添加到類中。


第一個被稱爲細化。如果您不是精煉Fixnum,而是剛剛爲其添加#minutes方法,那麼Fixnum將爲使用它的所有人提供該方法,只要您的代碼已加載。這可能會導致與同一方法的其他實現(例如活動記錄的#minutes)發生衝突,並導致難以解決且難以調試的問題。相反,您可以改進Fixnum類,並且只有在您添加了精簡的範圍內纔會使用該方法using

它有一些問題,並沒有很廣泛的使用。但是,對於這個問題的目的,包括一個模塊,並使用細化之間的區別是:

  • 包括將添加方法,你做列入類,而改進使其他類的背景下,地方表現不同它們被用來
  • 包括語義是(所有對象都會有新的方法包括),而改進的詞彙(您關閉下課後,如果您再次打開它,你不會看到精確的方法)

The第二個是在模塊內部對課程進行研究。這不會在任何地方添加方法。這只是由於搜索常量的方式,如果在當前類中找不到常量(在此例中爲VAL),則會在樹上進一步搜索。實際上並不那麼簡單,如果你想了解更多的細節,你可以閱讀here