3.1Ruby语言的模块(Module)

模块是方法、常量、类变量的集合。模块遵循标识符的命名规则,一般PascalCase命名法。

  • 模块不能被实例化
  • 模块也不能被子类继承

模块的定义

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

场景一:混入(mixin)

在定义类时使用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/back/ruby/1541.html

发表评论

登录后才能评论