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 end
|
10.22
7.3 糅和(Mix-in) 与多重继承
include方法通过“ < 父类名 ” ,一个子类可以得到父类的属性和方法;
通过“ include模块名 ” ,一个子类可以得到某个模块的常量和方法。类不能被 include 。
extend方法通过“.ectend(模块)”,一个实例对象可以得到某个模块的长了和方法,而不是整个类。
include 方法为一个类的所有对象包含某个模块; extend 方法为一个类的某个对象包含某个模块。
module Me
aStudent.talk # I'm talking. puts aStudent.sqrt(20.7,3.3) # 4.54972526643248 |
module Me class Student
|
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 aStudent=Student.new |
#E7.4-4.rb
|
总结一下:
require,load用于包含文件;include,extend则用于包含模块。
require加载文件一次,load加载文件多次。
require加载文件时可以不加后缀名,load加载文件时必须加后缀名。
require一般情况下用于加载库文件,而load用于加载配置文件。
利用load 多次加载文件的特性,可以用来实现程序的无缝升级和系统的热部署。程序功能改变了,你只需要重新load 一次,其它代码与它再次交互的时候,这个程序实际上已经不是原来的程序了。