2.10Ruby中模块的介绍

模块是方法和常量的集合。

  • 模块不能拥有实例
  • 模块不能被继承

模块的创建

module 模块名
  模块定义
end
module Mod
  include Math
  CONST = 1
  def meth
    #  ...
  end
end
Mod.class              #=> Module
Mod.constants          #=> [:CONST, :PI, :E]
Mod.instance_methods   #=> [:meth]

场景一:include

在定义类时使用include,模块中的方法、常量就都能被类引用。

module MyModule
  #共通的方法等
end

class MyClass1
  include MyModule
  # MyClass1 中独有的方法
end

class MyClass2
  include MyModule
  # MyClass2 中独有的方法
end

像上述代码那样,虽然有点类似于类的继承,但mix-in可以更加灵活地解决下面的问题。

  • 虽然两个类拥有相似的功能,但是不希望把它们作为相同的种类(Class)来考虑
  • Ruby不支持父类的多重继承,因此无法对已经继承的类添加共通的功能

场景二:命名空间(namespace)

无论是方法名还是类名,当然是越简洁且有意义越好,但是可能往往同一个名称在很多地方都会使用,因此,通过模块就可以很好地解决命名冲突的问题。命名空间(namespace),就是对方法、常量、类等名称进行区分及管理的单位。由于模块提供不同的命名空间,因此A模块中foo方法与B模块中的foo方法就会被程序认为是两个不同的方法。

#模块如何调用方法和常量
模块名.方法
模块名::常量

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/ruby/rubybasic/1541.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注