`
凌川__
  • 浏览: 83272 次
  • 性别: 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    
 

 

分享到:
评论

相关推荐

    php代码-环境为 PHP7.2 版本

    - 遵循最佳实践,如编写注释、使用命名空间、面向对象编程等,可以使代码更易于维护和扩展。 总的来说,这个压缩包为我们提供了一个研究PHP 7.2环境下的代码实现的机会,通过阅读和分析`main.php`,我们可以学习...

    中国电信本地网网络资源命名规范v2005-08

    - **7.1 PDH传输系统**:准同步数字系列传输系统。 - **7.2 SPDH传输系统**:同步数字系列传输系统。 - **7.3 SDH传输系统**:同步数字系列传输系统。 - **7.4 MSTP传输系统**:多业务传输平台。 - **7.5 微波传输...

    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. ...

    Access数据库技术及应用:第7章 Access 2010宏与VBA模块.ppt

    3. 保存宏,例如命名为“alone”。 4. 预览宏,通过“运行”按钮或双击宏名来执行宏。 **7.2 VBA编程** 当宏无法满足复杂的业务逻辑或跨数据库的代码共享时,VBA就显得尤为重要。VBA是VB的子集,内置于Office系列...

    python简明教程.chm

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

    简明python教程(chm)

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

    简明python教程

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

    第7章 用函数实现模块化程序设计.ppt

    在编程领域,模块化程序设计是一种重要的编程策略,它的核心思想是将复杂的程序分解成多个独立的、可重用的部分,这些部分被称为模块。在C语言中,函数是实现模块化设计的基本单元。本章主要讲解了如何使用函数来...

    第7章用函数实现模块化程序设计(1).ppt

    7.1 函数是什么 函数是程序中的基本单元,它们封装了一段完成特定任务的代码。函数名通常反映了其所执行的功能。当程序变得庞大且复杂时,将代码划分为多个函数可以使其结构更清晰,便于理解和调试。此外,通过函数...

    C语言编程 C语言程序设计 C语言入门教程 第7章 用函数实现模块化程序设计 共211页.ppt

    首先,7.1节阐述了为什么要使用函数。当程序规模增大,功能增多时,如果所有的代码都集中在main函数中,会使得代码变得难以理解和维护。通过模块化程序设计,我们可以将程序划分为多个具有特定功能的函数,每个函数...

    Verilog_HDL_华为入门教程

    **7.1 模块定义** - **3.1.1 简单事例**:介绍如何定义一个简单的Verilog HDL模块。 - **3.1.2 模块的结构**:详细介绍模块的组成部分及其作用。 - **3.1.3 模块语法**:描述模块定义的标准语法。 **7.2 模块端口*...

    会议管理系统详细设计.doc

    为了保证代码的可读性和可维护性,系统模块将遵循一定的命名规则,例如,以英文单词或词组表示模块功能,使用驼峰式命名法,确保每个模块名称具有明确的含义。 3 系统架构设计 3.1 三层架构 本系统采用常见的业务...

    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 ...

    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 不换行输出 ...

    阿里前端开发规范pdf文件

    7.1 异常捕获:全局异常捕获,避免程序因未处理异常而崩溃。 7.2 错误日志:记录错误信息,便于定位问题和分析。 7.3 用户反馈:提供友好的用户错误提示,引导用户解决问题。 八、无障碍性设计 8.1 ARIA 属性:合理...

Global site tag (gtag.js) - Google Analytics