Module:
模块的定义和类比较相似,使用module关键字。但模块不能被实例化,也不能被子类化,模块是独立的,且一个模块对像是Module类的一个实例。模块最常用的两个用途是作为命空间和混入(mixin)。
在模块中,可以定义实例变量、实例方法、类变量、类方法和属性等,并且在模块中还可能以定义类和模块。在类中也可以定义模块。
在访问模块中的实例成员,需要在类中饱含模块,然后实例化类以访问模块的实例成员。
module FirstModule
def go
puts "Go home"
end
def self.show #or FirstModule.show
puts "It's a red car."
end
end
FirstModule.show #It's a red car.
class Car
include FirstModule #在类中插入
end
car = Car.new
car.go #Go home
a)模块内方法调用:
module Test
def self.function
puts “ this is function test”
end
end
调用:Test.function
module Test2
class TestClass
def performance
puts “this is performance test”
end
end
end
调用:Test2::TestClass.new.performance
b)模块常量调用
module TestConst
PI = 3.14
end
调用:TestConst::PI
c) 模块用于命令空间(Namespace):防止命令冲突,这个就不多说了。
d) 模块用于混入(Mixins):
目的是实现多继承在类中混入模块和从基类继承非常相似,为的实例对像都可以调用实例成员,上面也提到了。在类中可以包含多个模块,但是类却不能继承自多个类。当需要给类的实例添加很多附加功能,且不想把这些功能全部放在基类中时,就可以使用模块来组织代码。
e) 加载和请求模块
i. 有时会把不同的类或模块存放在不同的文件中,在使用这些文件时,就需要使用load和require来加载这些文件。在使用文件中的模块和对象时,还需要使用include和extend方法。
ii. require 和 load的区别:
-
- load方法参数要求是包括文件扩展名的完整文件名,require则只需要传入库的名字,不需要像文件名那样的后缀;
- load把一个文件加载多次,而require则最多只能加载一次;
- require方法不公可以加载ruby源文件,还可以加载其它语言编写的源文件;load方法的作用就是复制和粘贴;
iii. include方法:
该方法主要用来将一个模块插入(混入)到一个类或者其它模块。在类定义中引入模块,使模块中的方法成为类的实例方法;这个模块的方法在引入它的类或模块中以函数的形式调用,include 并非将模块的实例方法简单 拷贝到类中, 而是建立了一个类到模块的引用。,如;
模块,文件名为:TestModule
module Foo
def hello
puts "This is my first module in Ruby!"
end
end
另有一个类文件名为:Test #Test类和TestModule模块在同一路径下
#require "D:/cucumber/Ruby/Module" #(加载文件)绝对路径
require “../Ruby/Module" #(加载文件)相对路径
class TestOne
include Foo #混入模块
def hi
puts "This is a class"
end
end
a=TestOne.new
a.hi
a.hello
iv. extend方法:
extend 用来在一个对象(object,或者说是instance)中引入一个模块,这类从而也具备了这个模块的方法,如:
module FirstModule
def helloMod
puts "This is a module."
end
end
class FirstClass
def helloClass
puts "This is a class."
end
end
c=FirstClass.new
c.helloClass #This is a class.
c.extend(FirstModule)
c.helloMod #This is a module.
v. 加载路径:
Ruby的加载路径是一个数组,可以使用全局变量$LOAD_PATH 或 $:进行访问。数组的每个元素都是一个目录史,ruby在这些目录中查找加载的文件,前面的目录比后面的目录优选被查找;可以使用 puts $: 输出路径;Ruby程序也可以通过修改$LOAD_PATH($:)数组的内容来修改加载路径;如:
puts $:
$: << "../.." #修改加载路径的值
puts"@@@@@@@"
puts $:
当然,我们可以对load或require使用绝对路径,这样可以完全绕过加载路径;