1.Mix-in 扩展
module MyModule # 共通的方法等
end
class MyClass1
include MyModule
# MyClass1中独有的方法
end
class MyClass2
include MyModule
# MyClass2中独有的方法
end
2.提供命名空间
使用 模块名.方法 的方式调用方法 这样的方法称为 模块函数
# 检查文件是否存在
p FileTest.exist?("/usr/bin/ruby") #=> true
# 文件大小
p FileTest.size("/usr/bin/ruby") #=> 1374694
3.module_function
使用了module_function,就可以使用:“模块名 . 方法名”的形式调用
module FooModule
def foo
p self
end
module_function :foo
end
FooModule.foo
4.Mix-in
module M
def meth
"meth"
end
end
class C
include M
end
c = C.new
p c.meth # => "meth"
C.include?(M) #=> true
类 C 的实例在调用方法时,Ruby 会按类 C、模块 M、类 C 的父类 Object 这个顺序查找该 方法,并执行第一个找到的方法。被包含的模块的作用就类似于虚拟的父类。
5.查找方法的规则
1 同继承关系一样,原类中已经定义了同名的方法时,优先使用该方法。
2 在同一个类中包含多个模块时,优先使用最后一个包含的模块。
3 嵌套 include 时,查找顺序也是线性的,此时的关系如图 8.8 所示。
4 相同的模块被包含两次以上时,第二次以后的会被省略。
6.extend方法
extend方法可以使单例类包含模块,并把模块的功能扩展到对象中.
module Edition
def edition(n)
"#{self} 第#{n}版"
end
end
str = "Ruby基础教程"
str.extend(Edition) #=> 将模块 Mix-in 进对象
p str.edition(5) #=> "Ruby基础教程第5版"
include 可以帮助我们突破继承的限制,通过模块扩展类的功能;而 extend 则可以帮助 我们跨过类,直接通过模块扩展对象的功能。
网友评论