在类中包含或继承模块的方法
问题描述:
我想了解在类中包含或继承模块的概念。每当我阅读时,我都会得到新的方法来在课堂中包含或继承一个模块。所以只想知道有多少种方式。下面是实施例中,我共享:在类中包含或继承模块的方法
实施例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
答
在三个中,只有最后一个包含一个模块。也就是说,它将模块中的方法添加到类中。
第一个被称为细化。如果您不是精炼Fixnum
,而是刚刚为其添加#minutes
方法,那么Fixnum
将为使用它的所有人提供该方法,只要您的代码已加载。这可能会导致与同一方法的其他实现(例如活动记录的#minutes
)发生冲突,并导致难以解决且难以调试的问题。相反,您可以改进Fixnum
类,并且只有在您添加了精简的范围内才会使用该方法using
。
它有一些问题,并没有很广泛的使用。但是,对于这个问题的目的,包括一个模块,并使用细化之间的区别是:
- 包括将添加方法,你做列入类,而改进使其他类的背景下,地方表现不同它们被用来
- 包括语义是(所有对象都会有新的方法包括),而改进的词汇(您关闭下课后,如果您再次打开它,你不会看到精确的方法)
The第二个是在模块内部对课程进行研究。这不会在任何地方添加方法。这只是由于搜索常量的方式,如果在当前类中找不到常量(在此例中为VAL
),则会在树上进一步搜索。实际上并不那么简单,如果你想了解更多的细节,你可以阅读here。
这三个例子做了非常不同的事情。你可以问这三者之间有什么区别。另一方面,如果你只是想要不同的语法,你可以得到很多,但是有什么意义呢? – ndn
我正在学习如何在课堂中包含一个模块。每当我看到我得到一个不同的方式。所以我的问题是为什么有3种方法做一个小东西.. – ankur
http:// ruby-doc .org/core-2.0.0/Module.html#method-i-prepend是另一种可能性。 –