Ruby 模块(Module)的基本概念

Ruby 模块(Module)的基本概念

Ruby 模块是一种将方法、常量和类变量组织在一起的容器。模块不能实例化,也不支持继承,但可以通过 includeextend 将其功能混入(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"

模块与类的区别

  • 实例化:类可以实例化,模块不能。
  • 继承:类支持继承,模块不支持。
  • 混入 :模块可以通过 includeextend 混入类中。

常用模块方法

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

相关推荐
yang_coder14 分钟前
juypter notebook启动ssl报错的处理记录
python·jupyter
夜郎king22 分钟前
RuoYi-Vue3 企业级后台快速落地实战指南
java·开发语言
江华森1 小时前
exp01_Python_数据类型
开发语言·python
希冀1231 小时前
【JavaScript】Javascript—JS进阶—Day03
开发语言·javascript·原型模式
gugucoding1 小时前
28. 【C语言】通用数据操作:`void *` 与类型无关编程
c语言·开发语言
大鱼>1 小时前
模型可解释性:特征重要性/SHAP/LIME
人工智能·python·机器学习·lstm
曹牧1 小时前
XML 解析过程中遇到 `org.xml.sax.SAXParseException
java·开发语言
代码不接地1 小时前
【时间序列预测】0.时间序列任务知识地图
python·ai编程
光影少年1 小时前
RN 架构:JS层、原生桥接层、原生渲染层 通信原理
开发语言·javascript·架构