Ruby模块是方法和常量的集合。 模块方法可以是实例方法或模块方法。实例方法是包含模块的类中的方法。
可以在不创建封装对象的情况下调用模块方法,但是实例方法不能这么直接调用。
Ruby模块类似于类,因为它们包含方法,类定义,常量和其他模块的集合。Ruby模块可定义为类。但无法使用模块来创建对象或子类。也没有继承的模块层次结构。
模块基本上主要有两个目的:
- 它们作为命名空间,防止对象名字冲突。
- 它们允许mixin工具在类之间共享功能。
语法
module ModuleName  
   statement1  
   statement2  
   ...........  
end
模块名称应以大写字母开头。
模块命名空间
在编写较大的文件时,需要生成大量可重用的代码。 这些代码被组织成类,可以插入到一个文件中。
例如,如果两个人在不同的文件中具有相同的方法名称。 并且这两个文件都需要包含在第三个文件中。 那么它可能会产生问题,因为这两个包含的文件中的方法名称是相同的。
这里,模块机制发挥作用。 模块定义一个命名空间,您可以在命名空间中定义方法和常量,而不用管其他方法和常量执行。
示例:
假设在modules-file1.rb中,定义了不同类型的图书馆书籍,如小说,恐怖等。
在modules-file2.rb中,定义了阅读的小说数量,包括小说小说。
在modules-file3.rb中,需要加载文件modules-file1.rb和modules-file2.rb。这里我们将使用模块机制。
创建文件:modules-file1.rb ,其代码如下所示 -
#!/usr/bin/ruby   
# Module defined in file1.rb file   
module Library   
   num_of_books = 300   
   def Library.fiction(120)   
   # ..   
   end   
   def Library.horror(180)   
   # ..   
   end   
end
创建文件:modules-file2.rb ,其代码如下所示 -
#!/usr/bin/ruby   
# Module defined in file2.rb file   
module Novel   
   total = 123   
   read = 25   
   def Novel.fiction(left)   
   # ...   
   end   
end
创建文件:modules-file3.rb ,其代码如下所示 -
require "Library"   
require "Novel"   
x = Library.fiction(Library::num_of_books)   
y = Novel.fiction(Novel::total)
通过在模块名称后带点(.)符号来调用模块方法,并使用模块名称和两个冒号引用常量。
模块混合
Ruby不支持多重继承。 模块消除了在Ruby中使用mixin的多重继承的需要。模块没有实例,因为它不是一个类。 但是,一个模块可以包含在一个类中。
当您在类中包含模块时,该类将可以访问模块的方法。
示例:
module Name   
   def bella   
   end   
   def ana   
   end   
end   
module Job   
   def editor   
   end   
   def writer   
   end   
end   
class Combo   
include Name   
include Job   
   def f   
   end   
end   
final=Combo.new   
final.bella   
final.ana   
final.editor   
final.writer   
final.f
这里,模块Name由方法bella和ana组成。 模块Job由方法editor和writer组成。Combo类包括两个模块,由于Combo可以访问所有四种方法。 因此,Combo类作为mixin混合类型使用。
