『Ruby』模块(Module)
文章目录
- 一、模块内有什么
- Ⅰ、定义常量
- Ⅱ、定义方法
- Ⅲ、定义类
- 二、导入模块
- 三、调用模块
- Ⅰ、调用常量
- Ⅱ、调用方法
- Ⅲ、实例化类并调用类方法
- 四、在类中嵌入模块
- 嵌入模块时的覆盖问题
- ①、类定义优先
- ②、最后嵌入优先
- 五、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)相关推荐
- 『MTCNN』2万多字教科书式详解
发现一篇关于MTCNN的博文,本来打算自己写一篇的,但看了这篇,我觉得不用我再写了,转载跟大家分享一下 尊重原创,转载自:https://blog.csdn.net/sinat_39783664/ar ...
- 『转载』Debussy快速上手(Verdi相似)
『转载』Debussy快速上手(Verdi相似) Debussy 是NOVAS Software, Inc(思源科技)发展的HDL Debug & Analysis tool,这套软体主要不是 ...
- 『TensorFlow』命令行参数解析
argparse很强大,但是我们未必需要使用这么繁杂的东西,TensorFlow自己封装了一个简化版本的解析方式,实际上是对argparse的封装 脚本化调用tensorflow的标准范式: impo ...
- 『Python』__getattr__()特殊方法
self的认识 & __getattr__()特殊方法 将字典调用方式改为通过属性查询的一个小class, class Dict(dict):def __init__(self, **kw): ...
- 『数据库』朴实无华的数据库绪论
『数据库』 朴实无华且枯燥的数据库教程–入门必看!(不收藏,真的吃亏了) 文章目录 数据库系统概述 数据模型 概念模型 数据库系统结构 数据库系统的组成 数据库系统概述 一.四个基本概念 1.数据(D ...
- 『电子书』分享一波码农必备编程开发类书籍[转]
分享一些书籍 看到书籍很多,感觉很不错,就收藏下来了,是百度盘的连接,失效的可以评论一下以此更新一下连接. 书籍清单 Python编程快速上手 细说PHP(第2版) Python核心编程(第3版) L ...
- ###好好###远离送命题: 问答系统中语义匹配的『杀手锏』
本文将介绍一套『独创』的语义匹配方法论和一个杀手级模型 本文受众: 自然语言处理/问答系统/智能助手/搜索/推荐 等相关行业从业者 对自然语言处理/智能助手感兴趣的普通读者 1. 引子 『问& ...
- 『网络安全』蜜罐到蜜网入门指南(三)蜜罐内部组成分析
原创不易,点个赞呗!如果喜欢,关注.收藏不迷路. 前言 大家好,<『网络安全』蜜罐到蜜网入门指南>进入第三篇. 通过前面的内容,我们知道了什么是蜜罐以及蜜罐的作用和分类等.点击下方链接,可 ...
- 用户名只能含有英文字母php,新增用户提示“『用户名』只能是字母和数字的组合三位以上。”...
新增用户提示"『用户名』只能是字母和数字的组合三位以上." 我们原来系统里面,部分用户名是两个字母的,为了新老系统对接,新建立账号也必须要是两位的,但是会提示这个. ======= ...
最新文章
- VR医疗|全球首例“换头手术”成功了么?
- 通过反射创建动态代理对象(三)
- linux 管道和重定向
- SAP ABAP实用技巧介绍系列之Debug XSLT transformation
- Linux 下 NFS服务的搭建
- Qt工作笔记-自定义QSortFilterProxyModel实现多列分别过滤
- apache/nginx中equest.getServerName()外网环境获取不到代理地址/域名
- 【SpringBoot】项目打成 jar 包后关于配置文件的外部化配置
- 爷青结是什么意思,爷青回是什么意思,爷青结和爷青回是什么梗
- linun开启oracle监听,Linux下配置Oracle监听器
- 【优化算法】蜻蜓算法(DA)【含Matlab源码 1306期】
- Java中parseInt()和valueOf(),toString()的区别
- linkedin android,如何在android中登录linkedin?
- 可以测试流放之路伤害的软件,流放之路:游戏难点!你知道平均每秒伤害(DPS)怎么计算吗!...
- 噪点测试软件 DeadPixelTest 使用方法
- 网络安全——钓鱼邮件和网站克隆
- 移动端实现点击按钮复制文本功能
- 商务周刊:别了,摩托罗拉
- Debian旧版本下载
- element Table el-tooltip
热门文章
- cf Educational Codeforces Round 48 C. Vasya And The Mushrooms
- 全球十大长寿食物排行榜
- 台式电脑点关闭计算机关不了,台式电脑关不了机怎么办(教你两个解决方法)...
- 第十四章 传奇的篇章仍将继续
- 步步高平板显示html啥意思,学HTML5的优势 让你步步高薪
- 雅诗兰黛旗下高端沙龙香水品牌,祖-玛珑推出沉浸式线上香氛体验
- win10双击运行.jar(JAVA环境安装)超详细过程
- 2020年南大CS预推免经历
- 微信小程序实现授权用户绑定的手机号,后台java解密
- 3000元左右的笔记本电脑推荐2023 3000元笔记本电脑性价比之王