本文共 984 字,大约阅读时间需要 3 分钟。
1. 命名空间
模块定义了一个命名空间,方法和常量可以在其中任意使用而不必担心被其他方法或常量干扰,例如:
module Test def Test.method() endend
模块常量的命名和类常量一样,都以大写字母开头,方法定义类似于类方法的定义。如果第三方的程序想要使用这些模块,可以简单地加载这两个文件,并引用它们的完整名称,例如:
require 'test'Test.method()
同类方法一样,可以用模块名和句点来调用模块方法,使用模块名和两个冒号来引用常量。
2. Mixin
模块并没有实例,因为模块并不是类。但是可以在类的定义中include一个模块,当包含发生时,模块的所有实例方法在类中也可以使用,例如:
class Mixin include Testendmixin = Mixin.new()mixin.method()
Ruby的include并非简单地将模块的实例方法拷贝至类中,它建立一个由类到所包含模块的引用。如果多个类包含这个模块,它们都指向相同的内容。
要混入客户类中的模块,可能会在客户对象中创建实例变量,并可能使用attr_reader或类似方法,定义这些实例变量的访问方法,例如:
moduel Test def method @item ||= [] endend
不过,这也可能造成一个mixin中的实例变量可能会和其宿主类或其他mixin中的实例变量相冲突,在运行时,程序可能会产生某些难以诊断的错误行为。
3. 包含其他文件
Ruby有两个语句可以包含文件。每次当load方法执行时,都会将指定的Ruby源文件包含进来,例如:
load 'test.rb'
更常见的是使用require方法来加载指定的文件,且只加载一次,例如:
require 'test'
被加载文件中的局部变量不会蔓延到加载它们所在的范围中。它们都可以接受相对或绝对路径,如果指定了一个相对路径,它们将会在当前加载路径中($:)的每个目录下搜索这个文件。使用load或require所加载的文件,也可以包含其他文件。
require是一个可执行的语句,比如它可能在一个if语句内,此外require还可以加载共享的二进制文件。load会无条件包含源文件,因此可以使用它来重新加载一个在程序开始执行后可能更改的源文件。
转载地址:http://culwa.baihongyu.com/