2016-12-07 60 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