Ruby 模块(Module)的基本概念

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 中强大的工具,合理使用可以显著提升代码的可维护性和复用性。

相关推荐
默_笙5 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003965 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫5 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技5 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读5 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时5 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
C语言小火车5 天前
C/C++ 为什么需要编译器?
开发语言·c++
奇思妙想聪明勤奋的小羊5 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd1235 天前
2026年第38周GitHub趋势周报
python·科技·github