- 浏览: 82360 次
- 性别:
最近访客 更多访客>>
最新评论
-
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 1732先看一句代码: ruby 代码 (1..9). ... -
8.3 正则表达式
2007-02-13 06:13 1526一本入门小书,不想涉及正则表达式,但是正则表达式与Ruby语言 ... -
8.2 再说字符串
2007-02-13 06:07 1259一. 生成一个字符串 字 ... -
8.1 再说数组
2007-02-13 06:03 1382一. 建立一个数组 ruby 代码 #E8.1- ... -
7.4 require 和 load
2007-02-13 05:59 1313程序 E7.3-1.rb中先写了Me模块,然后include ... -
7.3 糅和(Mix-in) 与多重继承
2007-02-13 05:55 1774糅和,也译作混合插入,也许就称作 Mix-in 比较合适。 现 ... -
6.5 访问控制
2007-02-13 05:43 1122在Ruby里,要读取,或是改变对象的属性,唯一的途径是调用对象 ... -
6.4 单例方法
2007-02-13 05:16 1005同一份设计蓝图(类),不同的实例对象,可以表现出不同的行为特征 ... -
6.3 实例变量、类变量、类方法
2007-02-13 05:28 2242学习编程的过程,就是深化理解变量的过程。在面向对象编程中也不例 ... -
6.2 增强父类方法
2007-02-13 04:39 972如果我们只是想增强父类的方法,而不是完全地替代它,就可以用关键 ... -
6.1 重载?重写
2007-02-13 04:11 1890在Java 中,重载(overload)和重写(overrid ... -
5.5 一些编码建议
2007-02-13 03:37 1074这里不是 Ruby语言的编 ... -
5.4 蓝图可以改变吗? ——动态语言
2007-02-13 03:28 747Ruby 是动态语言,你可以改变 Ruby 程序的结构,功能, ... -
5.3 详解变量—— 动态类型
2007-02-13 03:22 1103变量是什么?变量有哪些特征呢?学习编程的过程,就是深化理解变量 ... -
5.1 为什么是Ruby? 5.2 Ruby会长久么?
2007-02-13 03:16 9765.1 为什么是Ruby? 现 ... -
4.5 多态
2007-02-13 03:07 771不同的子类继承一个父 ... -
4.4 继承
2007-02-13 03:04 797如果我们要写一个学生 ... -
4.3 封装
2007-02-13 02:53 896让我们来定义一个类,类名是Person,类名首字母要大写;属性 ... -
4.1 两种思维方式 4.2 对象
2007-02-13 02:47 8934.1 两种思维方式 人们 ... -
3.11 一个综合小练习
2007-02-13 02:05 996还是求50以内的素数,尽可能地用到本章更多的语法,看程序 E3 ...
相关推荐
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 ...
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...
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. ...
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系统...
10.4 在结果中控制命名空间声明 第11章 深入了解类型 11.1 XQuery类型系统 11.2 内置类型 11.3 类型、节点和原子值 11.4 XQuery中的类型检查 11.5 自动类型转换 11.6 序列类型 11.7 构造器和转换 第...
标识符的命名 数据类型 对象 输出 它如何工作 逻辑行与物理行 缩进 概括 5. 运算符与表达式 简介 运算符 运算符优先级 计算顺序 结合规律 表达式 使用表达式 概括 6. 控制流 简介 if语句 ...
标识符的命名 数据类型 对象 输出 它如何工作 逻辑行与物理行 缩进 概括 5. 运算符与表达式 简介 运算符 运算符优先级 计算顺序 结合规律 表达式 使用表达式 概括 6. 控制流 简介 if语句 ...
标识符的命名 数据类型 对象 输出 它如何工作 逻辑行与物理行 缩进 概括 5. 运算符与表达式 简介 运算符 运算符优先级 计算顺序 结合规律 表达式 使用表达式 概括 6. 控制流 简介 if语句 使用if...
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.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 ...
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.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 ...
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 ...
目 录 ...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
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 引用完整...