我来自Java,现在我更多地使用Ruby。

我不熟悉的一个语言特性是模块。我想知道究竟什么是模块,什么时候使用模块,为什么使用模块而不是类?


当前回答

总结:模块是静态/实用类和mixin之间的交叉。

mixin是“部分”实现的可重用片段,可以以混搭的方式组合(或组合),以帮助编写新类。当然,这些类还可以有自己的状态和/或代码。

其他回答

╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║               ║ class                     ║ module                          ║
╠═══════════════╬═══════════════════════════╬═════════════════════════════════╣
║ instantiation ║ can be instantiated       ║ can *not* be instantiated       ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ usage         ║ object creation           ║ mixin facility. provide         ║
║               ║                           ║   a namespace.                  ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ superclass    ║ module                    ║ object                          ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ methods       ║ class methods and         ║ module methods and              ║
║               ║   instance methods        ║   instance methods              ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inheritance   ║ inherits behaviour and can║ No inheritance                  ║
║               ║   be base for inheritance ║                                 ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inclusion     ║ cannot be included        ║ can be included in classes and  ║
║               ║                           ║   modules by using the include  ║
║               ║                           ║   command (includes all         ║
║               ║                           ║   instance methods as instance  ║
║               ║                           ║   methods in a class/module)    ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ extension     ║ can not extend with       ║ module can extend instance by   ║
║               ║   extend command          ║   using extend command (extends ║
║               ║   (only with inheritance) ║   given instance with singleton ║
║               ║                           ║   methods from module)          ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝

定义类时,就是为数据类型定义了蓝图。 类保存数据,具有与该数据交互的方法,并用于实例化对象。

模块

模块是将方法、类和常量分组在一起的一种方式。 模块给你两个主要的好处: 模块提供名称空间,防止名称冲突。 命名空间有助于避免与其他人编写的同名函数和类发生冲突。 模块实现了mixin功能。

(包括在Klazz中的Module,可以让Klazz的实例访问Module 方法。) (用Mod扩展Klazz,使类Klazz可以访问Mods方法。)

模块在Ruby中,在某种程度上,对应于Java抽象类——有实例方法,类可以从它继承(通过include, Ruby称之为“mixin”),但没有实例。还有其他一些细微的差异,但这些信息足以让您入门。

第一个答案很好,给出了一些结构性的答案,但另一种方法是思考你在做什么。模块提供了可以跨多个类使用的方法——可以把它们看作“库”(就像你在Rails应用程序中看到的那样)。类是关于对象的;模块是关于函数的。

例如,身份验证和授权系统就是模块的好例子。身份验证系统跨多个应用程序级类工作(用户进行身份验证,会话管理身份验证,许多其他类将根据身份验证状态进行不同的操作),因此身份验证系统充当共享api。

当你在多个应用程序之间共享方法时,你也可以使用一个模块(同样,库模型在这里很好)。

基本上,模块不能被实例化。当一个类包含一个模块时,将生成一个代理超类,它提供对所有模块方法以及类方法的访问。

一个模块可以被多个类包含。模块不能被继承,但是这个“mixin”模型提供了一种有用的“多重继承”类型。OO纯粹主义者不同意这种说法,但是不要让纯粹妨碍了工作的完成。


(这个答案最初链接到http://www.rubycentral.com/pickaxe/classes.html,但该链接及其域名已不再有效。)