10.09

第七章

7.1 模块

Ruby标准包里的 Math 模块提供了许多方法,比如:求平方根 sqrt ,使用的时候要这么写:模块名.方法名(参数)。如:Math.sqrt( a*5+b )

Math 模块还提供了两个常量,圆周率π 和自然对数底 e,使用的时候要这么写:模块名::常量名。如:puts Math::PI

定义模块用module...end 。模块与类非常相似,但是:
A) 模块不可以有实例对象;
B) 模块不可以有子类。

7.2 命名空间

如你所见,只要include模块名,就能使用不同模块的sqrt方法,Math模块的sqrt方法不能有三个参数,Me模块的sqrt方法可以是一个参数,或者二个参数,或者三个参数。Me模块被include 在Math模块后面,Math模块的sqrt方法就被Me模块的sqrt方法覆盖了。

module Me
    def sqrt(num, rx=1, e=1e-10)
        #num,需要求平方根的目标;rx,迭代区间;e,精度
        num*=1.0
        (num - rx*rx).abs <e ? rx : sqrt(num, (num/rx + rx)/2, e)

end
end

include Math
puts sqrt(293)                   # 17.1172427686237

include Me
puts sqrt(293)                  # 17.1172427686237
puts sqrt(293, 5, 0.01)     # 17.1172429172153

10.22

7.3 糅和(Mix-in) 与多重继承

include方法通过“ < 父类名 ” ,一个子类可以得到父类的属性和方法;

通过“ include模块名 ” ,一个子类可以得到某个模块的常量和方法。类不能被 include 。

extend方法通过“.ectend(模块)”,一个实例对象可以得到某个模块的长了和方法,而不是整个类。

include 方法为一个类的所有对象包含某个模块; extend 方法为一个类的某个对象包含某个模块。

module Me
    def sqrt(num, rx=1, e=1e-10)
        num*=1.0
        (num - rx*rx).abs <e ? rx : sqrt(num, (num/rx + rx)/2, e)
    end
end

class Person
    def talk
        puts "I'm talking."
    end
end

class Student < Person
    include Me
end

aStudent=Student.new    #Student是Person的子类,并且集成了模块Me

aStudent.talk                             # I'm talking.

puts aStudent.sqrt(20.7,3.3)     # 4.54972526643248

module Me
    def sqrt(num, rx=1, e=1e-10)
        num*=1.0
        (num - rx*rx).abs <e ? rx : sqrt(num, (num/rx + rx)/2, e)
    end
end

class Student
end

aStudent=Student.new
aStudent.extend(Me)        #新增的实例继承了模块Me

puts aStudent.sqrt(93.1, 25)     # 9.64883412646315

7.4 require 和 load

Me模块写在文件 E7.4-1.rb中,将 Person类写在文件 E7.4-2.rb中,这时候 Student类如何使用 Me模块和 Person类呢?这里要用到require方法。

require方法包含另一个文件,另一个文件名需要是一个字符串。

require包含文件,只加载一次,遇到同一文件时自动忽略;不同路径下的同名文件会多次加载。

load包含文件,加载多次,即使是相同路径下同一文件。

#E7.4-3.rb
require "E7.4-1"
require "E7.4-2"
class Student < Person
    include Me
end

aStudent=Student.new
aStudent.talk # I'm talking.
puts aStudent.sqrt(77,2)   # 8.77496438739435

#E7.4-4.rb
load "E7.4-1.rb"
class Student
end

aStudent=Student.new
aStudent.extend(Me)
puts aStudent.sqrt(100.1, 12)            # 10.0049987506246

总结一下:
require,load用于包含文件;include,extend则用于包含模块。
require加载文件一次,load加载文件多次。
require加载文件时可以不加后缀名,load加载文件时必须加后缀名。
require一般情况下用于加载库文件,而load用于加载配置文件。
利用load 多次加载文件的特性,可以用来实现程序的无缝升级和系统的热部署。程序功能改变了,你只需要重新load 一次,其它代码与它再次交互的时候,这个程序实际上已经不是原来的程序了。

《Ruby语言入门教程v1.0》学习笔记-03的更多相关文章

  1. 《Ruby语言入门教程v1.0》学习笔记-01

    <Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...

  2. 《Ruby语言入门教程v1.0》学习笔记-02

    9.18 第四章 一切都是对象 这个章节的例子都举得很浅显易懂,而且作者的语言= =噗,委实生动有趣啊是~~ 4.1  两种思维方式 初期的编程思想是:以“如何做”为指导来编写代码.这时期的编程语言叫 ...

  3. HDFS v1.0学习笔记

    hdfs是一个用于存储大文件的分布式文件系统,是apache下的一个开源项目,使用java实现.它的设计目标是可以运行在廉价的设备上,运行在大多数的系统平台上,高可用,高容错,易于扩展. 适合场景 存 ...

  4. mapreduce v1.0学习笔记

    它是什么? 一个用于处理大数据开源的分布式计算框架,它由java实现,原生提供java编程交互接口,其它语言通过hadoop streaming方式和mapreduce框架交互. 可以做什么? 利用框 ...

  5. 《JavaScript语言入门教程》记录整理:运算符、语法和标准库

    目录 运算符 算数运算符 比较运算符 布尔运算符 二进制位运算符 void和逗号运算符 运算顺序 语法 数据类型的转换 错误处理机制 编程风格 console对象和控制台 标准库 Object对象 属 ...

  6. 《JavaScript语言入门教程》记录整理:面向对象

    目录 面向对象编程 实例对象与 new 命令 this关键字 对象的继承 Object对象的方法 严格模式(strict mode) 本系列基于阮一峰老师的<JavaScrip语言入门教程> ...

  7. RxJava2.0学习笔记2 2018年7月3日 周二

    摘记: 1.map -- 转换  有些服务端的接口设计,会在返回的数据外层包裹一些额外信息,这些信息对于调试很有用,但本地显示是用不到的.使用 map() 可以把外层的格式剥掉,只留下本地会用到的核心 ...

  8. 《Angular4从入门到实战》学习笔记

    <Angular4从入门到实战>学习笔记 腾讯课堂:米斯特吴 视频讲座 二〇一九年二月十三日星期三14时14分 What Is Angular?(简介) 前端最流行的主流JavaScrip ...

  9. Go语言入门教程(十)之函数

    Hello 各位小伙伴大家好,我是小栈君,假期一眨眼就过去了.不知道大家玩的是否开心呢? 上次我们讲到了关于Go语言的流程控制,小栈君也希望小伙伴跟着小栈君一步一个脚印的敲一下代码,相互进步.本期我们 ...

随机推荐

  1. 多线程下的performSelector和NSThread的使用

    多线程下的performSelector和NSThread的使用 NSThread的多线程使用: 我们可以使用这两种方法来使用线程中的问题 - (id)initWithTarget:(id)targe ...

  2. RT: np - new sbt project generation made simple(r)

    np - new sbt project generation made simple(r) As pointed out in the comments by @0__ below, there's ...

  3. EventLoop的设计

    1. Event Loop作为一个IO线程,通过IO复用来处理事件 2. 为了保证线程安全,任何需要修改IO线程资源的工作都交给IO线程亲自来做 3. 为了IO线程与其他线程互调,需要设计一个even ...

  4. Linux shell入门基础(八)

    八.shell脚本sed&awk 01.sed的使用 流编辑器-Steam Editor #ed /etc/passwd 1,10p …… 1s/root/byf/p(替换root为byf) ...

  5. HDU -2298 Toxophily(三分法)

    这道题目,可以推出物理公式直接来做,但是如果推不出来就必须用程序的一种算法来实现了,物理公式只是适合这一个或者某个题,但是这种下面这种解决问题的方法确实解决了一类问题 ----三分法,大家可能都听说过 ...

  6. 经验分享:CSS浮动(float,clear)通俗讲解(转载)

    很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能力差,也可能是没能遇到一篇通俗的教程. 前些天小菜终于搞懂了浮动的基本原理,迫不及待的分享给大家. 写在前面的话: 由于CSS内容比较多 ...

  7. Angular JS API

    ng function angular.bind angular.bootstrap angular.copy angular.element angular.equals angular.exten ...

  8. MySQL 删除数据库

    MySQL 删除数据库 使用 mysqladmin 删除数据库 使用普通用户登陆mysql服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库. 所以我们这边使用root用户登录,root用 ...

  9. PHP简单计算器

    工作之余,写着玩的. <?php $num1 = $_POST['num1']; $num2 = $_POST['num2']; $yusuan = $_POST['yusuan']; $jie ...

  10. 各种开源协议介绍 BSD、Apache Licence、GPL V2 、GPL V3 、LGPL、MIT

    现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种(http://www.opensource.org/licenses /alphabeti ...