我来自Java,现在我更多地使用Ruby。
我不熟悉的一个语言特性是模块。我想知道究竟什么是模块,什么时候使用模块,为什么使用模块而不是类?
我来自Java,现在我更多地使用Ruby。
我不熟悉的一个语言特性是模块。我想知道究竟什么是模块,什么时候使用模块,为什么使用模块而不是类?
当前回答
类
定义类时,就是为数据类型定义了蓝图。 类保存数据,具有与该数据交互的方法,并用于实例化对象。
模块
模块是将方法、类和常量分组在一起的一种方式。 模块给你两个主要的好处: 模块提供名称空间,防止名称冲突。 命名空间有助于避免与其他人编写的同名函数和类发生冲突。 模块实现了mixin功能。
(包括在Klazz中的Module,可以让Klazz的实例访问Module 方法。) (用Mod扩展Klazz,使类Klazz可以访问Mods方法。)
其他回答
╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║ ║ 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) ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝
我很惊讶居然还没人这么说。
由于提问者有Java背景(我也有),这里有一个类比。
类就像Java类一样简单。
模块类似于Java静态类。想想Java中的Math类。你不实例化它,你重用静态类中的方法(例如。math . random())。
总结:模块是静态/实用类和mixin之间的交叉。
mixin是“部分”实现的可重用片段,可以以混搭的方式组合(或组合),以帮助编写新类。当然,这些类还可以有自己的状态和/或代码。
模块在Ruby中,在某种程度上,对应于Java抽象类——有实例方法,类可以从它继承(通过include, Ruby称之为“mixin”),但没有实例。还有其他一些细微的差异,但这些信息足以让您入门。
类
定义类时,就是为数据类型定义了蓝图。 类保存数据,具有与该数据交互的方法,并用于实例化对象。
模块
模块是将方法、类和常量分组在一起的一种方式。 模块给你两个主要的好处: 模块提供名称空间,防止名称冲突。 命名空间有助于避免与其他人编写的同名函数和类发生冲突。 模块实现了mixin功能。
(包括在Klazz中的Module,可以让Klazz的实例访问Module 方法。) (用Mod扩展Klazz,使类Klazz可以访问Mods方法。)