Ruby 模块(Module)的基本概念
Ruby 模块是一种将方法、常量和类变量组织在一起的容器。模块不能实例化,也不支持继承,但可以通过 include 或 extend 将其功能混入(mix in)到类中。模块的主要用途包括:
- 命名空间:避免命名冲突。
- 代码复用:通过混入模块共享功能。
- 多重继承模拟:Ruby 不支持多重继承,但可以通过混入多个模块实现类似效果。
定义模块
模块使用 module 关键字定义,后跟模块名(通常以大写字母开头):
ruby
module MyModule
CONSTANT = "value"
def module_method
puts "This is a module method"
end
end
混入模块到类中
使用 include
include 将模块的方法作为实例方法混入类中:
ruby
class MyClass
include MyModule
end
obj = MyClass.new
obj.module_method # 输出: "This is a module method"
使用 extend
extend 将模块的方法作为类方法混入类中:
ruby
class MyClass
extend MyModule
end
MyClass.module_method # 输出: "This is a module method"
模块作为命名空间
模块可以嵌套其他模块、类或方法,避免命名冲突:
ruby
module Tools
class Hammer
def use
puts "Using hammer"
end
end
end
hammer = Tools::Hammer.new
hammer.use # 输出: "Using hammer"
模块中的 self.included 钩子
通过 self.included 钩子,可以在模块被混入时执行代码:
ruby
module MyModule
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
def class_method
puts "This is a class method"
end
end
end
class MyClass
include MyModule
end
MyClass.class_method # 输出: "This is a class method"
模块与类的区别
- 实例化:类可以实例化,模块不能。
- 继承:类支持继承,模块不支持。
- 混入 :模块可以通过
include或extend混入类中。
常用模块方法
Module.constants:返回当前模块的常量列表。Module.instance_methods:返回模块的实例方法列表。Module.nesting:返回当前嵌套的模块列表。
示例:模块混入与命名空间
ruby
module MathUtils
def self.square(x)
x * x
end
end
class Calculator
include MathUtils
end
puts MathUtils.square(4) # 输出: 16
模块是 Ruby 中强大的工具,合理使用可以显著提升代码的可维护性和复用性。