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

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


当前回答

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

其他回答

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

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

模块

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

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

命名空间:模块是命名空间…这在Java中是不存在的;)

我也从Java和python切换到Ruby,我记得也有同样的问题…

所以最简单的答案是,模块是一个名称空间,在Java中不存在。在java中,最接近命名空间的思想是包。

所以ruby中的模块就像java中的一样: 课吗?没有 接口?没有 抽象类?没有 包吗?是的(可能)

java中类中的静态方法:与ruby中模块中的方法相同

在java中,最小单位是一个类,你不能在类之外有一个函数。但是在ruby中这是可能的(像python一样)。

那么模块中包含什么呢? 类,方法,常量。模块在该名称空间下保护它们。

无实例:模块不能用于创建实例

混合:有时继承模型并不适合类,但就功能而言,想要将一组类/方法/常量组合在一起

ruby中关于模块的规则: —模块名称为UpperCamelCase 模块中的常量都是ALL CAPS(这条规则对所有ruby常量都是一样的,而不是特定于模块) —访问方式:使用。操作符 —访问常量:use:: symbol

一个简单的模块示例:

module MySampleModule
  CONST1 = "some constant"

  def self.method_one(arg1)
    arg1 + 2
  end
end

如何在模块中使用方法:

puts MySampleModule.method_one(1) # prints: 3

如何使用模块的常量:

puts MySampleModule::CONST1 # prints: some constant

关于模块的其他一些约定: 在一个文件中使用一个模块(像ruby类一样,每个ruby文件一个类)

╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║               ║ 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())。