模块作为命名空间

你可以将模块视为一种围绕一组方法,常量和类的命名“包装器”(wrapper)。模块内部的各种代码共享相同的“命名空间”(namespaces),因此它们彼此都可见,但对模块外部的代码不可见。

Ruby 类库定义了许多模块,如 Math 和 Kernel。Math 模块包含数学方法(例如 sqrt 以返回平方根)和常量(例如 PI)。Kernel 模块包含我们从一开始就使用的许多方法,例如 printputsgets

假设我们前面看过的模块:

modules1.rb
  1. module MyModule
  2. GOODMOOD = "happy"
  3. BADMOOD = "grumpy"
  4. def greet
  5. return "I'm #{GOODMOOD}. How are you?"
  6. end
  7. def MyModule.greet
  8. return "I'm #{BADMOOD}. How are you?"
  9. end
  10. end

我们可以访问模块常量,就像我们使用 :: 作用域解析运算符访问类常量一样,如下所示:

  1. puts(MyModule::GOODMOOD)

我们可以使用点表示法访问模块方法 - 即,指定模块名称后跟句点和方法名称。 以下会打印出来 “I’m grumpy. How are you?”:

  1. puts( MyModule.greet )