代码改变世界

一步一步学Ruby(十三):Ruby模块

  敏捷的水  阅读(12090)  评论(1编辑  收藏  举报

Class类是Module的子类,类是一种特殊形式的模块,这个可看我的这篇文章 一步一步学Ruby(五): Class, Module, Object,Kernel的关系

我们知道最顶级的类是Object,那么最顶级的模块就是Kernel

我们使用模块的的主要目的是用来组织代码,模块化代码,有点类似命名空间,但却有很大的不同

一、创建和使用模块

用module关键字来定义模块

image

module没有实例,我们使用时把module混合到类中来使用,我们也可以这么理解,把Module里的内容拷贝一份放到类里,成为类的一部分

image

我们可以把模块放到一个单独的文件里,然后使用时进行加载,看下面的示例,假设我们有一个project.rb的文件,包含了Project模块

image

我们将Project混合到Manager类里

image

注意: 在使用require或load时,请求加载的内容放到引号里,而inclue不是用引号,这是因为require或load使用字符串做为参数,而include使用常量形式的模块名,require和load使用字符串变量也可以.

二、混合进模块的类的方法查找

image

上面say方法查找路径为 D类-->D类里包含的模块-->C类-->C类包含的模块......>Object-->Kernel,当找到第一个时,搜索停止。

同名方法的查找,后面覆盖前面的

image

用super提升查找路径(调用查找路径上下一个匹配的方法),同样我们使用super可以调用父类的同名方法,initialize是自动执行

image

  • super 调用时,自动传递当前的参数
  • super(),不传任何参数
  • super(a,b,c) 传递指定的参数

三、模块和类可以相互嵌套

module也可以包含类,但调用时需要这样使用 模块名::类名.new

image

 

本文作者: 王德水

未经同意,禁止转载

编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
历史上的今天:
2008-02-10 CodeSmith实战(一):生成实体层
2008-02-10 CodeSmith学习笔记(三):重载render输出
2008-02-10 CodeSmith学习笔记(二):操作数据库
2008-02-10 CodeSmith学习笔记(一):设置属性为打开文件,保存文件
点击右上角即可分享
微信分享提示