模块是方法、常量、类变量的集合。
- 模块不能被实例化
- 模块也不能被子类继承
1.模块声明
module 模块名
模块主体
end
module Mod
include Math
CONST = 1
def meth
# ...
end
end
Mod.class #=> Module
Mod.constants #=> [:CONST, :PI, :E]
Mod.instance_methods #=> [:meth]
2.场景一:混入(mixin)
在定义类时可以使用include
混入模块,就可以得到模块中的所有方法、常量、类变量。
module MyModule
#共通的方法等
end
class MyClass1
include MyModule
# MyClass1 中独有的方法
end
class MyClass2
include MyModule
# MyClass2 中独有的方法
end
像上述代码那样,虽然有点类似于类的继承,但mix-in可以更加灵活地解决下面的问题。
- 虽然两个类拥有相似的功能,但是不希望把它们作为相同的种类(Class)来考虑
- Ruby不支持父类的多重继承,因此无法对已经继承的类添加共通的功能
3.场景二:命名空间(namespace)
无论是方法名还是类名,当然是越简洁且有意义越好,但是可能往往同一个名称在很多地方都会使用,因此,通过模块就可以很好地解决命名冲突的问题。命名空间(namespace),就是对方法、常量、类等名称进行区分及管理的单位。由于模块提供不同的命名空间,因此A模块中foo方法与B模块中的foo方法就会被程序认为是两个不同的方法。
#模块如何调用方法和常量
模块名.方法
模块名::常量
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/ruby/rubylang/1541.html