`
凌川__
  • 浏览: 82360 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

7.1 模块 7.2 命名空间

阅读更多

7.1  模块
我们常常把许多零散的小物件放在一个盒子里,或者放在一个抽屉里,这些小物件可能是铅笔,墨水,字典等学习用品,也有可能是不相关的几件物品。在程序中,相关的、不相关的代码的组合,叫作模块。一般情况下,我们总是把功能相关的代码放在一个模块里。
把功能相关的程序代码放在一个模块里,体现了模块的第一个作用:可以被其它程序代码重复使用。
看程序 E7.1-1.rb :

ruby 代码
  1. #E7.1-1.rb     
  2. puts  Math.sqrt(2)   # =>  1.4142135623731   
  3. puts  Math::PI      # =>  3.14159265358979  


Ruby标准包里的 Math 模块提供了许多方法,比如:求平方根 sqrt ,使用的时候要这么写:模块名.方法名(参数)。你可以 Math.sqrt(37.2/3) ,Math.sqrt( a*5+b ) ;  Math 模块还提供了两个常量,圆周率π 和自然对数底 e,使用的时候要这么写:模块名::常量名。
数学中常用的函数,Math模块都提供了。每个使用Math模块的程序员无须再重复编写这些常用的函数与常数。
定义模块用module...end 。模块与类非常相似,但是:
 A) 模块不可以有实例对象;
 B) 模块不可以有子类。
 

7.2  命名空间
如果你觉得Ruby标准包里的Math模块提供的sqrt方法不好,不能够设置迭代区间和精度,你重写了一个sqrt方法。你的同事在他的程序里需要调用你的sqrt方法,也要调用标准Math模块提供的sqrt方法,怎么办呢?
模块的第二个作用:提供了一个命名空间(namespace),防止命名冲突。
看程序 E7.2-1.rb :调用一个模块方法,与定义模块方法一样,要在方法名前加上模块名和一个点号“.”。模块方法提供了一个途径,在模块的外部访问模块内部方法,无须 include 模块。定义模块常量不需要如此。

ruby 代码 
  1. #E7.2-1.rb     
  2.   
  3. module  Me   
  4.   def sqrt(num, rx=1, e=1e-10)   
  5.     num*=1.0   
  6.      (num - rx*rx).abs 
  7.   end  
  8. end  
  9.   
  10. include Math   
  11. puts   sqrt(293)           # =>  17.1172427686237   
  12. #puts   sqrt(293, 5, 0.01)                   
  13.                                        
  14. include Me                           
  15. puts   sqrt(293)           # =>  17.1172427686237                         
  16. puts   sqrt(293, 5, 0.01)    # =>  17.1172429172153            


如你所见,只要include模块名,就能使用不同模块的sqrt方法,Math模块的sqrt方法不能有三个参数,Me模块的sqrt方法可以是一个参数,或者二个参数,或者三个参数。Me模块被include 在Math模块后面,Math模块的sqrt方法就被Me模块的sqrt方法覆盖了。
现在出现一个问题,你喜欢像Math模块那样调用sqrt方法,
puts   Math.sqrt(2)
而不喜欢像Me模块那样调用sqrt方法,
include Me
puts   sqrt(2)


还记得类方法吗?我们可以定义一个模块方法,在方法名前加上模块名和一个点号“.”。
看程序 E7.2-2.rb :

ruby 代码
  1. #E7.2-2.rb    
  2.   
  3. module Me   
  4.   def sqrt(num, rx=1, e=1e-10)   
  5.     num*=1.0   
  6.    (num - rx*rx).abs 
  7.   end  
  8. end  
  9.   
  10. module Me2   
  11.   def Me2.sqrt(*num)   
  12.     "This is text sqrt. "  
  13.   end  
  14.   PI=3.14   
  15. end  
  16.   
  17. puts   Math.sqrt(1.23)   # => 1.10905365064094   
  18. puts   Math::PI         # => 3.14159265358979   
  19. puts    Me2.sqrt(55, 66, 77, 88, 99)  # => This is text sqrt.   
  20. puts    Me2::PI                  # => 3.14   
  21.   
  22. include Me   
  23. puts   sqrt(456, 7, 0.01)   # => 21.3541565188558  

调用一个模块方法,与定义模块方法一样,要在方法名前加上模块名和一个点号“.”。模块方法提供了一个途径,在模块的外部访问模块内部方法,无须 include 模块。定义模块常量不需要如此。

   

完整阅读,请看我写的 Ruby语言中文教程all in one    
 

 

分享到:
评论

相关推荐

    BBS 模块设计说明书

    1. 模块命名规则 5 2. 模块汇总 5 2.1 模块汇总表 5 2.2 模块关系图 6 3. 前台子系统的模块设计 6 3.1显示所有分类模块设计 6 4. 后台子系统的模块设计 6 4.1用户信息变更模块设计 6 7. 实体类设计 7 7.1 留言类 7 ...

    代码规范原则与事例,很详尽的文本

    5.6 名称空间Namespace)命名 6 编码规则 6.1 错误检查规则 6.2 大括号规则 6.3 缩进规则 6.4 小括号规则 6.5 If Then Else规则 6.6 比较规则 6.7 Case规则 6.8 对齐规则 6.9 单语句规则 6.10 单一功能规则 6.11 ...

    bbs数据库设计说明书

    1. 模块命名规则 5 2. 模块汇总 5 2.1 模块汇总表 5 2.2 模块关系图 6 3. 前台子系统的模块设计 6 3.1显示所有分类模块设计 6 4. 后台子系统的模块设计 6 4.1用户信息变更模块设计 6 7. 实体类设计 7 7.1 留言类 7 ...

    学校信息管理系统概要设计报告

    1.3 命名规则 1 1.4 术语定义 1 1.5 参考资料 2 1.6 相关文档 2 1.7 版本更新记录 2 第2章 总体设计 7 2.1 总体结构设计 7 2.2 运行环境设计 7 2.3 子系统清单 9 2.4 功能模块清单 10 第3章 模块(部件)功能分配 15...

    Python 中文手册

    9.2. Python 作用域和命名空间 9.2.1. 作用域和命名空间示例 9.3. 初识类 9.3.1. 类定义语法 9.3.2. 类对象 9.3.3. 实例对象 9.3.4. 方法对象 9.4. 一些说明 9.5. 继承 9.5.1. 多继承 9.6. 私有变量 9.7. 补充 9.8. ...

    VB+ACCESS编制的图书管理系统的设计与实现

    7.2数据库命名标准与规范 10 7.3数据库逻辑设计 10 7.4数据库物理设计 10 7.4.1表、视图汇总 10 7.4.2各表、视图设计详解 11 八、软件体系结构设计说明书 15 8.1系统概述 15 8.2设计约束 15 8.3设计策略 15 8.4系统...

    XQuery权威指南(简码·扫描版)

     10.4 在结果中控制命名空间声明 第11章 深入了解类型  11.1 XQuery类型系统  11.2 内置类型  11.3 类型、节点和原子值  11.4 XQuery中的类型检查  11.5 自动类型转换  11.6 序列类型  11.7 构造器和转换 第...

    python简明教程.chm

    标识符的命名 数据类型 对象 输出 它如何工作 逻辑行与物理行 缩进 概括 5. 运算符与表达式 简介 运算符 运算符优先级 计算顺序 结合规律 表达式 使用表达式 概括 6. 控制流 简介 if语句 ...

    简明python教程(chm)

    标识符的命名 数据类型 对象 输出 它如何工作 逻辑行与物理行 缩进 概括 5. 运算符与表达式 简介 运算符 运算符优先级 计算顺序 结合规律 表达式 使用表达式 概括 6. 控制流 简介 if语句 ...

    简明python教程

    标识符的命名 数据类型 对象 输出 它如何工作 逻辑行与物理行 缩进 概括 5. 运算符与表达式 简介 运算符 运算符优先级 计算顺序 结合规律 表达式 使用表达式 概括 6. 控制流 简介 if语句 使用if...

    Windows 内核情景分析--采用开源代码ReactOS (上册) part01

    7.1 视窗线程与Win32k扩充系统调用 556 7.2 视窗报文的接收 566 7.3 Win32k的用户空间回调机制 590 7.4 用户空间的外挂函数 602 7.5 视窗报文的发送 615 7.6 键盘输入线程 628 7.7 鼠标器输入线程 642 7.8 ...

    ABP开发指南

    7.6.3 关于命名空间 139 7.7 基础设施层 139 7.7.1 数据库迁移 139 7.7.2 实体映射 143 7.7.3 仓储实现 143 7.8 应用层 145 7.8.1 应用服务及数据传输对象 145 7.8.2 DTO验证 149 7.8.3 动态Web API控制器 150 7.9 ...

    Asp.net物资流通管理系统源码

    7.2 数据库的连接与关闭连接 22 7.2.1 数据库连接与关闭连接的重要性 22 7.2.2 该系统中数据库的连接与关闭 22 7.3 安全性问题 24 7.3.1 数据库安全问题 24 7.3.2 系统安全问题 24 7.4 类库的设计与实现 24 7.4.1 ...

    介绍python基础知识

    3.2 标识符的命名规则 3.3 变量 4. 关键字 4.1 关键字的概念 4.2 查看关键字 5. 输出 5.1 标准化输出 5.2 格式化输出(%) 5.3 格式化输出(format 函数) 5.4 格式化输出(print(f"string={}")) 5.5 不换行输出 ...

    Oracle.11g.从入门到精通 (1/2)

    7.1.3 实现命名简洁性和易读性 7.1.4 实现更改灵活性 7.2 实现记录的唯一性 7.2.1 用键实现 7.2.2 创建唯一索引 7.2.3 使用序列实现 7.3 实现数据的完整性 7.3.1 域完整性 7.3.2 实体完整性 7.3.3 引用完整性 7.3.4 ...

    Oracle.11g.从入门到精通 (2/2)

    7.1.3 实现命名简洁性和易读性 7.1.4 实现更改灵活性 7.2 实现记录的唯一性 7.2.1 用键实现 7.2.2 创建唯一索引 7.2.3 使用序列实现 7.3 实现数据的完整性 7.3.1 域完整性 7.3.2 实体完整性 7.3.3 引用完整性 7.3.4 ...

    概要设计说明书模板-简版.doc

    目 录 ...4.1 功能模块命名原则 4 4.2 功能层次图 4 4.3 功能简介 4 4.4 外部接口 4 5 用户界面设计 4 5.1 基本原则 4 5.2 设计概述 4 6 出错处理 5 7.1 出错信息设计 5 7.2 异常情况处理 5

    Oracle11g从入门到精通

    7.1.3 实现命名简洁性和易读性 7.1.4 实现更改灵活性 7.2 实现记录的唯一性 7.2.1 用键实现 7.2.2 创建唯一索引 7.2.3 使用序列实现 7.3 实现数据的完整性 7.3.1 域完整性 7.3.2 实体完整性 7.3.3 引用完整...

Global site tag (gtag.js) - Google Analytics