什么是模块

模块(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中的模块的更多相关文章

  1. Ruby中Enumerable模块的一些实用方法

    我在查看 Array 类和 Hash 类的祖先链的时候都发现了 Enumerable,说明这两个类都mixin了Enumerable模块.Enumerable模块为集合型类提供了遍历.检索.排序等方法 ...

  2. 理解Ruby中的作用域

    作用域对于Ruby以及其它编程语言都是一个需要理解的至关重要的基础知识.在我刚开始学习ruby的时候遇到很多诸如变量未定义.变量没有正确赋值之类的问题,归根结底是因为自己对于ruby作用域的了解不够, ...

  3. ruby中symbol

    Symbol 是什么 Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby 版本为1.8.6),在 Ruby 中 Symbol 表示“名字”,比如字符串的名字,标识符的名字. 创建一个 Symb ...

  4. Ruby类,模块1

    类的扩展和继承 class Fixnum def dosome(str) puts str end def abs puts "覆盖了原有的方法" end end puts 1.c ...

  5. [Ruby学习总结]Ruby中的类

    1.类名的定义以大写字母开头,单词首字母大写,不用"_"分隔 2.实例化对象的时候调用new方法,实际上调用的是类里边的initialize方法,是ruby类的初始化方法,功能等同 ...

  6. node (02 CommonJs 和 Nodejs 中自定义模块)顺便讲讲module.exports和exports的区别 dependencies 与 devDependencies 之间的区别

    CommonJS 规范的提出,主要是为了弥补当前 JavaScript 没有标准的缺陷.它的终极目标就是:提供一个类似 Python,Ruby 和 Java 语言的标准库,而不只是停留在小脚本程序的阶 ...

  7. ruby中的回调方法和钩子方法

    在ruby中,当某些特定的事件发生时,将调用回调方法和钩子方法.事件有如下几种: 调用一个不存在的对象方法 类混含一个模块 定义类的子类 给类添加一个实例方法 给对象添加一个单例方法 引用一个不存在的 ...

  8. Ruby中区分运行来源的方法(转)

    Ruby中区分运行来源的方法 这篇文章主要介绍了Ruby中区分运行来源的方法,本文讲解的是类似Python中的if name == 'main':效果,其实Ruby中也有类似语法,需要的朋友可以参考下 ...

  9. ruby中的方法查找

    ruby中的方法调用都是 对象.方法 的形式,那么对象如何找到这个方法呢? 首先必须了解祖先链的概念,祖先链就是从一个类开始,到它的父类,再到父类的父类...一直到最终的起点(ruby中是BasicO ...

随机推荐

  1. RESTFul Shiro

    RESTFul与服务没有关系?REST的本质是设计风格,不是技术. REST的URL还是个URL,就是个普通的URL,访问这个URL的时候,先被Servlet Filter(即Shiro 的Filte ...

  2. 公司简介 - CCDI悉地国际-工程实践专业服务的引领者

    公司简介 - CCDI悉地国际-工程实践专业服务的引领者 关于悉地国际         CCDI悉地国际(以下简称"CCDI")创立于1994年,是在城市建设和开发领域从事综合专业 ...

  3. unity3d游戏开发猜想——当程序猿老去

    程序猿将代码注入生命去打造互联网的浪潮之巅.当有一天他们老了.会走向那里,会做些什么? 4.4.0" alt="" style="border:0px; ver ...

  4. Hadoop MapReduce编程的一些个人理解

    首先要实现mapreduce就要重写两个函数,一个是map 还有一个是reduce map(key ,value) map函数有两个參数,一个是key,一个是value 假设你的输入类型是TextIn ...

  5. eclipse导入myeclipse的web项目没法识别问题解决方法

    1.进入项目目录,找到.project文件,打开. 2.找到<natures>...</natures>代码段. 3.在第2步的代码段中加入如下标签内容并保存: <nat ...

  6. QT工程pro设置实践(with QtCreator)----非弄的像VS一样才顺手?

    源地址:http://my.oschina.net/jinzei/blog/100989?fromerr=DhQJzZQe 相信大家很多和我一样,用多了微软给的便利,用人家的就十分不习惯.于是就琢磨原 ...

  7. OnClick事件的Sender参数的前世今生——TWinControl.WinProc优先捕捉到鼠标消息,然后使用IsControlMouseMsg函数进行消息转发给图形子控件(意外发现OnClick是由WM_LBUTTONUP触发的)

    这是一个再普通不过的Button1Click执行体: procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage('I am B ...

  8. 根据li标签 查找class="alcw4 alcw41"对应的值

    jrhmpt01:/root/lwp/0526# cat a2.pl use LWP::UserAgent; use DBI; use POSIX; use Data::Dumper; use HTM ...

  9. 关于VC6编译LPDIRECT3D8不通过的问题

    重装了系统,打开以前的工程看看,重新编译发现类似的错误: error C2146: syntax error : missing ';' before identifier 'lpdi' fatal ...

  10. Effective C++_笔记_条款08_别让异常逃离析构函数

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) C++并不禁止析构函数吐出异常,但它不鼓励你这样做.考虑如下代码 ...