模块与类不同,我们何时应该使用模块?我们可以创建模块的实例,还是从一个模块继承?
答案 0 :(得分:1)
Modules和classes在Ruby中有很多相似之处。 实用的区别在于模块通常用于:
提供命名空间以避免类名冲突。例如,以下代码将在两个单独的模块中创建一个Bar类,可以Foo::Bar
和Baz::Bar
寻址:
module Foo
class Bar; end
end
module Baz
class Bar; end
end
在单个命名空间中包含或包装多个类。例如,要提供Foo::Bar
和Foo::Baz
:
module Foo
class Bar; end
class Baz; end
end
提供mixins。由于Ruby只使用单继承,因此您可以在类中使用#include个模块,或者使用#extend个对象。这使您可以非常灵活地构建类,并提高可重用性。例如,使用#bar方法提供Baz和Quux的实例:
module Foo
def bar; end
end
class Baz
include Foo
end
class Quux
include Foo
end
肯定存在其他差异,但一般来说,您可以将模块视为特殊类型的类。这在技术上是正确的,因为Module.class === Class
,但不要过度简化。但是,它应该为你提供一个务实的起点。
答案 1 :(得分:0)
这里有很多不同的问题,我同意其他人的观点,这是你真正需要从一些基本的Ruby编程源获得的东西。但是,有一套盆栽的答案可以帮助您:
模块如何与类不同,
一个类就是制作对象的东西。对象同时具有动作和状态:也就是说,您可以告诉类的实例(在方法中),它将存储有关自身的信息(在属性中)。
在Ruby中,我们使用一个模块来处理很多事情,主要是:
我们什么时候应该使用模块?
你不能自然地使用模块来创建像类这样的对象,并且它实际上并不像类那样保持状态。因此,如果你想拥有一堆每个都有状态且可以做东西的对象,你需要一个类,而不是一个模块。
如果不需要那些东西,你可能正在看一个模块。但Ruby是一种非常适应的语言 - 不止一种方法可以做任何事情。
我们可以创建模块的实例,还是从一个模块继承?
不。你需要一个班级。
答案 2 :(得分:-1)
您希望通过假设对象集和字符分配器(即类/模块)之间的关系来表征(即,给方法,变量,常量)一组对象。一般而言,不仅在计算中,有两种模式(以及其他模式)具有这种关系。
一种模式是对象具有一个且只有一个从给定组中选择的角色分配器。其他领域的例子是:
在Ruby的面向对象编程模型中,这表示为对象集合是类的实例。每个Ruby对象都是至少一个类的实例,最多只有一个类。它可以是String
类或Array
类的实例,但不能同时为两者。
另一种模式是,对于每个角色分配者(可能是多个),对象要么携带该角色,要么为每个角色分配者单独决定。其他领域的例子是:
在Ruby的面向对象编程模型中,这表示为继承模块的对象的集合。 Ruby对象可能会也可能不会继承Enumerable
模块,它可能会也可能不会继承Comparable
,这是单独决定的。