模块作为命名空间
你可以将模块视为一种围绕一组方法,常量和类的命名“包装器”(wrapper)。模块内部的各种代码共享相同的“命名空间”(namespaces),因此它们彼此都可见,但对模块外部的代码不可见。
Ruby 类库定义了许多模块,如 Math 和 Kernel。Math 模块包含数学方法(例如 sqrt
以返回平方根)和常量(例如 PI
)。Kernel 模块包含我们从一开始就使用的许多方法,例如 print
,puts
和 gets
。
假设我们前面看过的模块:
modules1.rb
module MyModule
GOODMOOD = "happy"
BADMOOD = "grumpy"
def greet
return "I'm #{GOODMOOD}. How are you?"
end
def MyModule.greet
return "I'm #{BADMOOD}. How are you?"
end
end
我们可以访问模块常量,就像我们使用 ::
作用域解析运算符访问类常量一样,如下所示:
puts(MyModule::GOODMOOD)
我们可以使用点表示法访问模块方法 - 即,指定模块名称后跟句点和方法名称。 以下会打印出来 “I’m grumpy. How are you?”:
puts( MyModule.greet )