- 浏览: 83809 次
- 性别:
最近访客 更多访客>>
最新评论
-
Bernice_liu:
谢谢分享,受益匪浅,适合我——初学者
Ruby语言中文教程all in one -
何枫abc:
怎么感觉Ruby有点像C!!!
3.5 标识名和变量的作用域 3.6 类库 3.7 数据类型 -
何枫abc:
谢谢了!!!你写的很好,现在我正在学Ruby!!!
第二章 运行环境 -
yangzhihuan:
正想知道ruby是怎么样生成像javadoc那样的文档,多谢了 ...
3.1 注释与分行 -
whisper:
从lambda演算的角度说我们并不关心一个东西到底是什么,而只 ...
变量一定要有类型吗(一)
7.1 模块
我们常常把许多零散的小物件放在一个盒子里,或者放在一个抽屉里,这些小物件可能是铅笔,墨水,字典等学习用品,也有可能是不相关的几件物品。在程序中,相关的、不相关的代码的组合,叫作模块。一般情况下,我们总是把功能相关的代码放在一个模块里。
把功能相关的程序代码放在一个模块里,体现了模块的第一个作用:可以被其它程序代码重复使用。
看程序 E7.1-1.rb :
- #E7.1-1.rb
- puts Math.sqrt(2) # => 1.4142135623731
- 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 模块。定义模块常量不需要如此。
- #E7.2-1.rb
- module Me
- def sqrt(num, rx=1, e=1e-10)
- num*=1.0
- (num - rx*rx).abs
- end
- end
- include Math
- puts sqrt(293) # => 17.1172427686237
- #puts sqrt(293, 5, 0.01)
- include Me
- puts sqrt(293) # => 17.1172427686237
- 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 :
- #E7.2-2.rb
- module Me
- def sqrt(num, rx=1, e=1e-10)
- num*=1.0
- (num - rx*rx).abs
- end
- end
- module Me2
- def Me2.sqrt(*num)
- "This is text sqrt. "
- end
- PI=3.14
- end
- puts Math.sqrt(1.23) # => 1.10905365064094
- puts Math::PI # => 3.14159265358979
- puts Me2.sqrt(55, 66, 77, 88, 99) # => This is text sqrt.
- puts Me2::PI # => 3.14
- include Me
- puts sqrt(456, 7, 0.01) # => 21.3541565188558
调用一个模块方法,与定义模块方法一样,要在方法名前加上模块名和一个点号“.”。模块方法提供了一个途径,在模块的外部访问模块内部方法,无须 include 模块。定义模块常量不需要如此。
完整阅读,请看我写的 Ruby语言中文教程all in one
发表评论
-
8.4 迭代器、代码块、闭包
2007-02-13 06:25 1768先看一句代码: ruby 代码 (1..9). ... -
8.3 正则表达式
2007-02-13 06:13 1562一本入门小书,不想涉及正则表达式,但是正则表达式与Ruby语言 ... -
8.2 再说字符串
2007-02-13 06:07 1347一. 生成一个字符串 字 ... -
8.1 再说数组
2007-02-13 06:03 1475一. 建立一个数组 ruby 代码 #E8.1- ... -
7.4 require 和 load
2007-02-13 05:59 1359程序 E7.3-1.rb中先写了Me模块,然后include ... -
7.3 糅和(Mix-in) 与多重继承
2007-02-13 05:55 1807糅和,也译作混合插入,也许就称作 Mix-in 比较合适。 现 ... -
6.5 访问控制
2007-02-13 05:43 1180在Ruby里,要读取,或是改变对象的属性,唯一的途径是调用对象 ... -
6.4 单例方法
2007-02-13 05:16 1039同一份设计蓝图(类),不同的实例对象,可以表现出不同的行为特征 ... -
6.3 实例变量、类变量、类方法
2007-02-13 05:28 2273学习编程的过程,就是深化理解变量的过程。在面向对象编程中也不例 ... -
6.2 增强父类方法
2007-02-13 04:39 1036如果我们只是想增强父类的方法,而不是完全地替代它,就可以用关键 ... -
6.1 重载?重写
2007-02-13 04:11 1926在Java 中,重载(overload)和重写(overrid ... -
5.5 一些编码建议
2007-02-13 03:37 1147这里不是 Ruby语言的编 ... -
5.4 蓝图可以改变吗? ——动态语言
2007-02-13 03:28 776Ruby 是动态语言,你可以改变 Ruby 程序的结构,功能, ... -
5.3 详解变量—— 动态类型
2007-02-13 03:22 1186变量是什么?变量有哪些特征呢?学习编程的过程,就是深化理解变量 ... -
5.1 为什么是Ruby? 5.2 Ruby会长久么?
2007-02-13 03:16 10175.1 为什么是Ruby? 现 ... -
4.5 多态
2007-02-13 03:07 796不同的子类继承一个父 ... -
4.4 继承
2007-02-13 03:04 836如果我们要写一个学生 ... -
4.3 封装
2007-02-13 02:53 930让我们来定义一个类,类名是Person,类名首字母要大写;属性 ... -
4.1 两种思维方式 4.2 对象
2007-02-13 02:47 9334.1 两种思维方式 人们 ... -
3.11 一个综合小练习
2007-02-13 02:05 1025还是求50以内的素数,尽可能地用到本章更多的语法,看程序 E3 ...
相关推荐
- 遵循最佳实践,如编写注释、使用命名空间、面向对象编程等,可以使代码更易于维护和扩展。 总的来说,这个压缩包为我们提供了一个研究PHP 7.2环境下的代码实现的机会,通过阅读和分析`main.php`,我们可以学习...
- **7.1 PDH传输系统**:准同步数字系列传输系统。 - **7.2 SPDH传输系统**:同步数字系列传输系统。 - **7.3 SDH传输系统**:同步数字系列传输系统。 - **7.4 MSTP传输系统**:多业务传输平台。 - **7.5 微波传输...
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. ...
3. 保存宏,例如命名为“alone”。 4. 预览宏,通过“运行”按钮或双击宏名来执行宏。 **7.2 VBA编程** 当宏无法满足复杂的业务逻辑或跨数据库的代码共享时,VBA就显得尤为重要。VBA是VB的子集,内置于Office系列...
标识符的命名 数据类型 对象 输出 它如何工作 逻辑行与物理行 缩进 概括 5. 运算符与表达式 简介 运算符 运算符优先级 计算顺序 结合规律 表达式 使用表达式 概括 6. 控制流 简介 if语句 ...
标识符的命名 数据类型 对象 输出 它如何工作 逻辑行与物理行 缩进 概括 5. 运算符与表达式 简介 运算符 运算符优先级 计算顺序 结合规律 表达式 使用表达式 概括 6. 控制流 简介 if语句 ...
标识符的命名 数据类型 对象 输出 它如何工作 逻辑行与物理行 缩进 概括 5. 运算符与表达式 简介 运算符 运算符优先级 计算顺序 结合规律 表达式 使用表达式 概括 6. 控制流 简介 if语句 使用if...
在编程领域,模块化程序设计是一种重要的编程策略,它的核心思想是将复杂的程序分解成多个独立的、可重用的部分,这些部分被称为模块。在C语言中,函数是实现模块化设计的基本单元。本章主要讲解了如何使用函数来...
7.1 函数是什么 函数是程序中的基本单元,它们封装了一段完成特定任务的代码。函数名通常反映了其所执行的功能。当程序变得庞大且复杂时,将代码划分为多个函数可以使其结构更清晰,便于理解和调试。此外,通过函数...
首先,7.1节阐述了为什么要使用函数。当程序规模增大,功能增多时,如果所有的代码都集中在main函数中,会使得代码变得难以理解和维护。通过模块化程序设计,我们可以将程序划分为多个具有特定功能的函数,每个函数...
**7.1 模块定义** - **3.1.1 简单事例**:介绍如何定义一个简单的Verilog HDL模块。 - **3.1.2 模块的结构**:详细介绍模块的组成部分及其作用。 - **3.1.3 模块语法**:描述模块定义的标准语法。 **7.2 模块端口*...
为了保证代码的可读性和可维护性,系统模块将遵循一定的命名规则,例如,以英文单词或词组表示模块功能,使用驼峰式命名法,确保每个模块名称具有明确的含义。 3 系统架构设计 3.1 三层架构 本系统采用常见的业务...
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 ...
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 ...
3.2 标识符的命名规则 3.3 变量 4. 关键字 4.1 关键字的概念 4.2 查看关键字 5. 输出 5.1 标准化输出 5.2 格式化输出(%) 5.3 格式化输出(format 函数) 5.4 格式化输出(print(f"string={}")) 5.5 不换行输出 ...
7.1 异常捕获:全局异常捕获,避免程序因未处理异常而崩溃。 7.2 错误日志:记录错误信息,便于定位问题和分析。 7.3 用户反馈:提供友好的用户错误提示,引导用户解决问题。 八、无障碍性设计 8.1 ARIA 属性:合理...
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 ...