如何在Ruby中使用不同的模块和类?

时间:2016-03-14 02:10:54

标签: ruby class module

模块与类不同,我们何时应该使用模块?我们可以创建模块的实例,还是从一个模块继承?

3 个答案:

答案 0 :(得分:1)

语用差异和过度简化

Modulesclasses在Ruby中有很多相似之处。 实用的区别在于模块通常用于:

  1. 提供命名空间以避免类名冲突。例如,以下代码将在两个单独的模块中创建一个Bar类,可以Foo::BarBaz::Bar寻址:

    module Foo
      class Bar; end
    end
    
    module Baz
      class Bar; end
    end
    
  2. 在单个命名空间中包含或包装多个类。例如,要提供Foo::BarFoo::Baz

    module Foo
      class Bar; end
      class Baz; end
    end
    
  3. 提供mixins。由于Ruby只使用单继承,因此您可以在类中使用#include个模块,或者使用#extend个对象。这使您可以非常灵活地构建类,并提高可重用性。例如,使用#bar方法提供Baz和Quux的实例:

    module Foo
      def bar; end
    end
    
    class Baz
      include Foo
    end
    
    class Quux
      include Foo
    end
    
  4. 肯定存在其他差异,但一般来说,您可以将模块视为特殊类型的类。这在技术上是正确的,因为Module.class === Class,但不要过度简化。但是,它应该为你提供一个务实的起点。

答案 1 :(得分:0)

这里有很多不同的问题,我同意其他人的观点,这是你真正需要从一些基本的Ruby编程源获得的东西。但是,有一套盆栽的答案可以帮助您:

  

模块如何与类不同,

一个类就是制作对象的东西。对象同时具有动作和状态:也就是说,您可以告诉类的实例(在方法中),它将存储有关自身的信息(在属性中)。

在Ruby中,我们使用一个模块来处理很多事情,主要是:

  • 将课程分组
  • 使功能添加到类(mixin)。
  • 当我们想要一堆行动但不需要上课时。
  

我们什么时候应该使用模块?

你不能自然地使用模块来创建像类这样的对象,并且它实际上并不像类那样保持状态。因此,如果你想拥有一堆每个都有状态且可以做东西的对象,你需要一个类,而不是一个模块。

如果不需要那些东西,你可能正在看一个模块。但Ruby是一种非常适应的语言 - 不止一种方法可以做任何事情。

  

我们可以创建模块的实例,还是从一个模块继承?

不。你需要一个班级。

答案 2 :(得分:-1)

您希望通过假设对象集和字符分配器(即类/模块)之间的关系来表征(即,给方法,变量,常量)一组对象。一般而言,不仅在计算中,有两种模式(以及其他模式)具有这种关系。

一种模式是对象具有一个且只有一个从给定组中选择的角色分配器。其他领域的例子是:

    GUI中的
  • 单选按钮
  • emacs文本编辑器中的主要模式
  • 一个人的姓名,父母等。

在Ruby的面向对象编程模型中,这表示为对象集合是的实例。每个Ruby对象都是至少一个类的实例,最多只有一个类。它可以是String类或Array类的实例,但不能同时为两者。

另一种模式是,对于每个角色分配者(可能是多个),对象要么携带该角色,要么为每个角色分配者单独决定。其他领域的例子是:

    GUI中的
  • 复选框
  • emacs文本编辑器中的次要模式
  • 一个人是一个学校的校友,一个公司的(前)员工等。

在Ruby的面向对象编程模型中,这表示为继承模块的对象的集合。 Ruby对象可能会也可能不会继承Enumerable模块,它可能会也可能不会继承Comparable,这是单独决定的。