Ruby学习笔记四——模块
2010-02-04 20:09
399 查看
#一、模块定义及引用,模块就是一段代码,里面有一些方法放一起。
#定义模块用module...end 。模块与类非常相似,但是:
#A) 模块不可以有实例对象;
#B) 模块不可以有子类。
include Math
puts sqrt(91);
module Me
def sqrt(a)
puts a*a;
return a*a;
end
PI=3.1415926
end
include Me
puts sqrt(10)
puts Math.sqrt(10);
puts Math::PI;
puts Me::PI;#变量引用与方法调用不同,用双冒号,而不是点号
#二、可变参数
def params(*num)
"This is text sqrt. "
puts num.size
puts num[1]
puts num.inspect
end
params(4,2,3)
#三、模块的第三个作用,实现类似于多重继承的功能,也称Mix-in
#我们有一个Student类,有着Person类的属性和方法,还会做数学题——求平方根。已经有了Me模块,只要Mix-in 在Student类里就可以了。
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
aStudent.talk # I'm talking.
puts aStudent.sqrt(20.7,3.3) # 4.54972526643248
#通过“ < 父类名 ” ,一个子类可以得到父类的属性和方法;通过“ include模块名 ” ,一个子类可以得到某个模块的常量和方法。类不能被 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 Student
end
aStudent=Student.new
aStudent.extend(Me)
puts aStudent.sqrt(93.1, 25) # 9.64883412646315
#include 方法为一个类的所有对象包含某个模块; extend 方法为一个类的某个对象包含某个模块。
#五、require和load
#require,load用于包含文件;include,extend则用于包含模块。
#require加载文件一次,load加载文件多次。
#require加载文件时可以不加后缀名,load加载文件时必须加后缀名。
#require一般情况下用于加载库文件,而load用于加载配置文件。
#利用load 多次加载文件的特性,可以用来实现程序的无缝升级和系统的热部署。程序功能改变了,你只需要重新load 一次,其它代码与它再次交互的时候,这个程序实际上已经不是原来的程序了。
#E7.4-3.rb
require "class"#引入了class.rb文件
class Student < Person
include Me
end
aStudent=Student.new("zhangren",100)
aStudent.talk # I'm talking.
puts aStudent.sqrt(77,2) # 8.77496438739435
load "class.rb"
class Student <Person
end
aStudent=Student.new("zzR@...")
aStudent.extend(Me)
puts aStudent.sqrt(100.1, 12) # 10.0049987506246
aStudent.talk
#定义模块用module...end 。模块与类非常相似,但是:
#A) 模块不可以有实例对象;
#B) 模块不可以有子类。
include Math
puts sqrt(91);
module Me
def sqrt(a)
puts a*a;
return a*a;
end
PI=3.1415926
end
include Me
puts sqrt(10)
puts Math.sqrt(10);
puts Math::PI;
puts Me::PI;#变量引用与方法调用不同,用双冒号,而不是点号
#二、可变参数
def params(*num)
"This is text sqrt. "
puts num.size
puts num[1]
puts num.inspect
end
params(4,2,3)
#三、模块的第三个作用,实现类似于多重继承的功能,也称Mix-in
#我们有一个Student类,有着Person类的属性和方法,还会做数学题——求平方根。已经有了Me模块,只要Mix-in 在Student类里就可以了。
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
aStudent.talk # I'm talking.
puts aStudent.sqrt(20.7,3.3) # 4.54972526643248
#通过“ < 父类名 ” ,一个子类可以得到父类的属性和方法;通过“ include模块名 ” ,一个子类可以得到某个模块的常量和方法。类不能被 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 Student
end
aStudent=Student.new
aStudent.extend(Me)
puts aStudent.sqrt(93.1, 25) # 9.64883412646315
#include 方法为一个类的所有对象包含某个模块; extend 方法为一个类的某个对象包含某个模块。
#五、require和load
#require,load用于包含文件;include,extend则用于包含模块。
#require加载文件一次,load加载文件多次。
#require加载文件时可以不加后缀名,load加载文件时必须加后缀名。
#require一般情况下用于加载库文件,而load用于加载配置文件。
#利用load 多次加载文件的特性,可以用来实现程序的无缝升级和系统的热部署。程序功能改变了,你只需要重新load 一次,其它代码与它再次交互的时候,这个程序实际上已经不是原来的程序了。
#E7.4-3.rb
require "class"#引入了class.rb文件
class Student < Person
include Me
end
aStudent=Student.new("zhangren",100)
aStudent.talk # I'm talking.
puts aStudent.sqrt(77,2) # 8.77496438739435
load "class.rb"
class Student <Person
end
aStudent=Student.new("zzR@...")
aStudent.extend(Me)
puts aStudent.sqrt(100.1, 12) # 10.0049987506246
aStudent.talk
相关文章推荐
- ruby学习笔记之【混乱的模块】
- 学习笔记1:Ruby模块:module
- Ruby学习笔记2(方法、块、模块)
- java学习个人笔记---finally模块的陷阱
- 【JAVAWEB学习笔记】网上商城实战5:后台的功能模块
- OpenCV学习笔记二:OpenCV模块一览
- OpenCv学习笔记(一)--OpenCv所涉及的主要模块的简述
- Python学习笔记-模块介绍(一)-模块概念和基本使用
- Python学习笔记-4(模块:collections、itertools、xml)
- OPNET学习笔记之sink模块
- 微软企业库4.1学习笔记(十五)缓存模块3 使用数据库作为后端存储
- Ruby学习笔记(14)_异常
- Python学习笔记总结(二)函数和模块
- Python学习笔记(三十四)—内置模块(3)base64
- Python学习笔记——模块
- JS闭包学习笔记(3):模块
- 微软企业库4.1学习笔记(三十二)数据访问模块 在应用中使用数据访问模块
- 【Python学习笔记】第三方模块
- 微软企业库5.0学习笔记(三十五)数据访问模块 DataSet以及数据库事务
- 13.lua学习笔记:模块与包