文章目录

  • 一、模块内有什么
    • Ⅰ、定义常量
    • Ⅱ、定义方法
    • Ⅲ、定义类
  • 二、导入模块
  • 三、调用模块
    • Ⅰ、调用常量
    • Ⅱ、调用方法
    • Ⅲ、实例化类并调用类方法
  • 四、在类中嵌入模块
    • 嵌入模块时的覆盖问题
      • ①、类定义优先
      • ②、最后嵌入优先
  • 五、Mixins

一、模块内有什么

模块是方法、类、常量的组合,它相当于定义了一个命名空间,里面的内容单独有一个空间。以大写字母开头。定义类似Python

module ModuleName# [VALUE...]# [Class...]# [def...]
end

Ⅰ、定义常量

直接定义常量

# TestModule.rb
module TestModuleVALUE = 1
end

Ⅱ、定义方法

为了能从外部调用,方法必须命名为module.function

# TestModule.rb
module TestModuledef TestModule.testfunctionputs 1end
end

如果不是为了调用,而是为了引入成为类方法,则不需要module
见四

# TestModule.rb
module TestModuledef testfunctionputs 1end
end

Ⅲ、定义类

直接定义类

# TestModule.rb
module TestModuleclass TestClassdef initialize(a)@a = aenddef testfunctionputs @aendend
end

二、导入模块

类似Python的import和C的include,Ruby使用require导入模块

导入自定义模块之前需要添加$LOAD_PATH << '.'指明只能从当前路径,要么就是用require_relative 相对路径,不指定路径时导入公用模块。扩展名可省略

可以在任何地方导入模块、导入多个模块

$LOAD_PATH << '.'
require 'Module'
require 'Module.rb'require_relative 'Module'

三、调用模块

Ⅰ、调用常量

使用module::const调用常量

# TestModule.rb
module TestModuleVALUE = 1
end
require_relative 'TestModule'
puts TestModule::VALUE

Ⅱ、调用方法

使用module.function调用模块内方法

# TestModule.rb
module TestModuledef TestModule.testfunctionputs 1end
end
require_relative 'TestModule'
TestModule.testfunction

Ⅲ、实例化类并调用类方法

使用module::class.new(args)实例化类,模块类算作静态常量

# TestModule.rb
module TestModuleclass TestClassdef initialize(a)@a = aenddef testfunctionputs @aendend
end
require_relative 'TestModule'
testclass = TestModule::TestClass.new(1)
testclass.testfunction

四、在类中嵌入模块

Ruby支持使用include module将模块镶嵌到类中,使得实例化类可以使用模块,注意定义方法不能指定模块名

可以在类内任何地方嵌入模块、嵌入多个模块

# IncludeModule.rb
module IncludeModuleVALUE = 1def helloputs "hello"end
end
require_relative 'IncludeModule'class Ainclude IncludeModule
endputs A::VALUE
a = A.new
a.hello
1
hello

嵌入模块时的覆盖问题

类嵌入模块遇到同名常量、方法时会有覆盖问题

①、类定义优先

只要类定义了同名常量、方法,按类优先处理,不会覆盖

常量:

# IncludeModule.rb
module IncludeModule1VALUE = 1
end
module IncludeModule2VALUE = 2
end
require_relative 'IncludeModule'class Ainclude IncludeModule1VALUE = 0include IncludeModule2
endputs A::VALUE
0

方法:

# IncludeModule.rb
module IncludeModule1def helloputs "hello1"end
end
module IncludeModule2def helloputs "hello2"end
end
require_relative 'IncludeModule'class Ainclude IncludeModule1def helloputs 'hello0'endinclude IncludeModule2
enda = A.new
a.hello
hello0

②、最后嵌入优先

支持嵌入多个模块,最后嵌入模块中的同名方法、常量被保留

常量:

# IncludeModule.rb
module IncludeModule1VALUE = 1
end
module IncludeModule2VALUE = 2
end
require_relative 'IncludeModule'class Ainclude IncludeModule1include IncludeModule2
endputs A::VALUE
2

方法:

# IncludeModule.rb
module IncludeModule1def helloputs "hello1"end
end
module IncludeModule2def helloputs "hello2"end
end
require_relative 'IncludeModule'class Ainclude IncludeModule1include IncludeModule2
enda = A.new
a.hello
hello2

五、Mixins

Ruby没有继承的概念,如果一个类需要“继承父类方法”,将“父类方法”写入module,使用include嵌入

将模块include到类定义中,模块中的方法就mix进了类中。

类 Sample 继承了两个模块、类 Sample 使用了多重继承或 mixin 。

module Adef a1enddef a2end
end
module Bdef b1enddef b2end
endclass Sample
include A
include Bdef s1end
endsamp=Sample.new
samp.a1
samp.a2
samp.b1
samp.b2
samp.s1

『Ruby』模块(Module)相关推荐

  1. 『MTCNN』2万多字教科书式详解

    发现一篇关于MTCNN的博文,本来打算自己写一篇的,但看了这篇,我觉得不用我再写了,转载跟大家分享一下 尊重原创,转载自:https://blog.csdn.net/sinat_39783664/ar ...

  2. 『转载』Debussy快速上手(Verdi相似)

    『转载』Debussy快速上手(Verdi相似) Debussy 是NOVAS Software, Inc(思源科技)发展的HDL Debug & Analysis tool,这套软体主要不是 ...

  3. 『TensorFlow』命令行参数解析

    argparse很强大,但是我们未必需要使用这么繁杂的东西,TensorFlow自己封装了一个简化版本的解析方式,实际上是对argparse的封装 脚本化调用tensorflow的标准范式: impo ...

  4. 『Python』__getattr__()特殊方法

    self的认识 & __getattr__()特殊方法 将字典调用方式改为通过属性查询的一个小class, class Dict(dict):def __init__(self, **kw): ...

  5. 『数据库』朴实无华的数据库绪论

    『数据库』 朴实无华且枯燥的数据库教程–入门必看!(不收藏,真的吃亏了) 文章目录 数据库系统概述 数据模型 概念模型 数据库系统结构 数据库系统的组成 数据库系统概述 一.四个基本概念 1.数据(D ...

  6. 『电子书』分享一波码农必备编程开发类书籍[转]

    分享一些书籍 看到书籍很多,感觉很不错,就收藏下来了,是百度盘的连接,失效的可以评论一下以此更新一下连接. 书籍清单 Python编程快速上手 细说PHP(第2版) Python核心编程(第3版) L ...

  7. ###好好###远离送命题: 问答系统中语义匹配的『杀手锏』

    本文将介绍一套『独创』的语义匹配方法论和一个杀手级模型 本文受众: 自然语言处理/问答系统/智能助手/搜索/推荐 等相关行业从业者 对自然语言处理/智能助手感兴趣的普通读者 1. 引子 『问& ...

  8. 『网络安全』蜜罐到蜜网入门指南(三)蜜罐内部组成分析

    原创不易,点个赞呗!如果喜欢,关注.收藏不迷路. 前言 大家好,<『网络安全』蜜罐到蜜网入门指南>进入第三篇. 通过前面的内容,我们知道了什么是蜜罐以及蜜罐的作用和分类等.点击下方链接,可 ...

  9. 用户名只能含有英文字母php,新增用户提示“『用户名』只能是字母和数字的组合三位以上。”...

    新增用户提示"『用户名』只能是字母和数字的组合三位以上." 我们原来系统里面,部分用户名是两个字母的,为了新老系统对接,新建立账号也必须要是两位的,但是会提示这个. ======= ...

最新文章

  1. VR医疗|全球首例“换头手术”成功了么?
  2. 通过反射创建动态代理对象(三)
  3. linux 管道和重定向
  4. SAP ABAP实用技巧介绍系列之Debug XSLT transformation
  5. Linux 下 NFS服务的搭建
  6. Qt工作笔记-自定义QSortFilterProxyModel实现多列分别过滤
  7. apache/nginx中equest.getServerName()外网环境获取不到代理地址/域名
  8. 【SpringBoot】项目打成 jar 包后关于配置文件的外部化配置
  9. 爷青结是什么意思,爷青回是什么意思,爷青结和爷青回是什么梗
  10. linun开启oracle监听,Linux下配置Oracle监听器
  11. 【优化算法】蜻蜓算法(DA)【含Matlab源码 1306期】
  12. Java中parseInt()和valueOf(),toString()的区别
  13. linkedin android,如何在android中登录linkedin?
  14. 可以测试流放之路伤害的软件,流放之路:游戏难点!你知道平均每秒伤害(DPS)怎么计算吗!...
  15. 噪点测试软件 DeadPixelTest 使用方法
  16. 网络安全——钓鱼邮件和网站克隆
  17. 移动端实现点击按钮复制文本功能
  18. 商务周刊:别了,摩托罗拉
  19. Debian旧版本下载
  20. element Table el-tooltip

热门文章

  1. cf Educational Codeforces Round 48 C. Vasya And The Mushrooms
  2. 全球十大长寿食物排行榜
  3. 台式电脑点关闭计算机关不了,台式电脑关不了机怎么办(教你两个解决方法)...
  4. 第十四章 传奇的篇章仍将继续
  5. 步步高平板显示html啥意思,学HTML5的优势 让你步步高薪
  6. 雅诗兰黛旗下高端沙龙香水品牌,祖-玛珑推出沉浸式线上香氛体验
  7. win10双击运行.jar(JAVA环境安装)超详细过程
  8. 2020年南大CS预推免经历
  9. 微信小程序实现授权用户绑定的手机号,后台java解密
  10. 3000元左右的笔记本电脑推荐2023 3000元笔记本电脑性价比之王