ruby中的模块
什么是模块
模块(module)是Ruby特有的功能之一。类用来表现具有数据与行为(程序)的"东西",
而模块大致来说,则是只有程序部分的集合体。类与模块最大的不同在于:
1.模块不能建立实例
2.模块不能继承
模块的用法
(1)提供命名空间
命名空间(namespace)是为了让方法、常数、类名称不互相冲突而设计的机制。命名时
名称简洁明快虽然是个好习惯,但像size、start这种太普通的名称可能就很容易重复。
这时,定义成模块的内部名称,可防止名称的冲突。
例如:Ruby将取得文件信息的相关功能都放在File模块里。以模块形式提供的方法
必须使用"模块名.方法名"的方式调用。以这种形式调用的方法又称为模块函数。
#查询文件是否存在
p File.exist?("text.txt") #=>true
#档案大小
p File.size("text.txt") #=>6389
当模块内部定义的方法及常数的名称没有与现在命名空间冲突时,省略模块名称会比较方便.
使用include可以将模块所拥有的方法名称与常数名称读入现在的命名空间里。
例如,数值运算用的Math模块:
# 圆周率(常数)
p Math::PI #=>3.141592653589793
# 2的平方根
p Math.sqrt(2) #=>1.4142135623730951
include Math
p PI #=>3.141592653589793
p sqrt(2) #=>1.4142135623730951
像这样,将相关的各种功能整理成一个模块,可以以相同的命名空间来管理这些功能。
(2)以Mix-in方式提供功能
将模块混进类里,成为”Mix-in“。在类的定义内使用include,可以将模块里所定义的方
法与常数纳入类定义里。
module MyModule
# 想要共同提供的方法等
end
class MyClass1
include MyModule
#MyClass1 所特有的方法
end
class MyClass2
include MyModule
#MyClass2 所特有的方法
end
像这样,就能将MyClass1与MyClass2双方共同的功能定义在MyModule中。这与类继承很
相似,但用于这种时候:
a.两个类只是具有相似功能,并不想归类于相同类型(类)时;
b.Ruby的继承不允许同时又多个父类,已继承别的父类时,就无法再以继承的方式加上其它功能
这些情况就可以使用Mix-in更弹性地处理。
继承与Mix-in的关系将在后续文章中再详细介绍。
ruby中的模块的更多相关文章
- Ruby中Enumerable模块的一些实用方法
我在查看 Array 类和 Hash 类的祖先链的时候都发现了 Enumerable,说明这两个类都mixin了Enumerable模块.Enumerable模块为集合型类提供了遍历.检索.排序等方法 ...
- 理解Ruby中的作用域
作用域对于Ruby以及其它编程语言都是一个需要理解的至关重要的基础知识.在我刚开始学习ruby的时候遇到很多诸如变量未定义.变量没有正确赋值之类的问题,归根结底是因为自己对于ruby作用域的了解不够, ...
- ruby中symbol
Symbol 是什么 Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby 版本为1.8.6),在 Ruby 中 Symbol 表示“名字”,比如字符串的名字,标识符的名字. 创建一个 Symb ...
- Ruby类,模块1
类的扩展和继承 class Fixnum def dosome(str) puts str end def abs puts "覆盖了原有的方法" end end puts 1.c ...
- [Ruby学习总结]Ruby中的类
1.类名的定义以大写字母开头,单词首字母大写,不用"_"分隔 2.实例化对象的时候调用new方法,实际上调用的是类里边的initialize方法,是ruby类的初始化方法,功能等同 ...
- node (02 CommonJs 和 Nodejs 中自定义模块)顺便讲讲module.exports和exports的区别 dependencies 与 devDependencies 之间的区别
CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没有标准的缺陷.它的终极目标就是:提供一个类似 Python,Ruby 和 Java 语言的标准库,而不只是停留在小脚本程序的阶 ...
- ruby中的回调方法和钩子方法
在ruby中,当某些特定的事件发生时,将调用回调方法和钩子方法.事件有如下几种: 调用一个不存在的对象方法 类混含一个模块 定义类的子类 给类添加一个实例方法 给对象添加一个单例方法 引用一个不存在的 ...
- Ruby中区分运行来源的方法(转)
Ruby中区分运行来源的方法 这篇文章主要介绍了Ruby中区分运行来源的方法,本文讲解的是类似Python中的if name == 'main':效果,其实Ruby中也有类似语法,需要的朋友可以参考下 ...
- ruby中的方法查找
ruby中的方法调用都是 对象.方法 的形式,那么对象如何找到这个方法呢? 首先必须了解祖先链的概念,祖先链就是从一个类开始,到它的父类,再到父类的父类...一直到最终的起点(ruby中是BasicO ...
随机推荐
- 关于caffe-windows中 compute_image_mean.exe出现的问题
这两天有兴致装了下caffe.感受下这个框架. 可是在这个过程中遇到非常多问题.我把碰到的问题和解决方式写下,便于后人高速上手. compute_image_mean.exe 编译出来后.运行数据变换 ...
- DNS:因特网的目录服务
作者:华科小涛,http://www.cnblogs.com/hust-ghtao/ 有两种方式来识别主机:通过主机名或IP地址.人们当然喜欢便于记忆的主机名,而路由器则喜欢定长的.有层次结构的IP地 ...
- Cocos2D-X学习笔记 3 从一个场景切换到还有一个场景
工厂方法一般写法 StartLayer * StartLayer::create() { StartLayer *sl = new StartLayer(); sl->init(); sl-&g ...
- poj1459 Power Network --- 最大流 EK/dinic
求从电站->调度站->消费者的最大流,给出一些边上的容量.和电站和消费者能够输入和输出的最大量. 加入一个超级源点和汇点,建边跑模板就能够了. 两个模板逗能够. #include < ...
- Struts 2最新0day破坏性漏洞(远程任意代码执行)等的重现方法
Struts 2的远程任意代码执行和重定向漏洞,是这两天互联网上最重大的安全事件,据说国内互联网企业中,很多电商纷纷中招,应该已经有大规模的用户隐私泄露.这里我们简单总结下怎样在自己机子上重现这些漏洞 ...
- 类似QtiPlot的veusz,sigmaplot,pymol
qtiplot在win下没那么好编译 依赖很多外部包的 scidavis 和 labplot是从他fork出来的 比较接近Origin 可以用这两个 FreeBSD 的 ports 里有直接 cd / ...
- 一道c++小编程题,
题目: 编写一个小程序,从标准输入读入一系列string对象,寻找连续重复出现的单词,程序应该找出满足以下条件的单词的输入位置:该单词的后面紧跟着再次出现自己本身,跟 踪重复次数量多的单词及其重复次数 ...
- IT大数据服务管理高级课程(IT服务,大数据,云计算,智能城市)
个人简历 金石先生是马克思主义中国化的研究学者,上海财经大学经济学和管理学硕士,中国民主建国会成员,中国特色社会主义人文科技管理哲学的理论奠基人之一.金石先生博学多才,对问题有独到见解.专于工作且乐于 ...
- 杭电 1711 Number Sequence
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 获取字符宽度:并非自适应。coretext去计算
获取字符宽度:并非自适应.coretext去计算 UniChar ch = [ns_str characterAtIndex:0]; CGGlyph glyph = 0; CTFontGetGlyph ...