📜  Ruby模块

📅  最后修改于: 2021-01-08 13:09:34             🧑  作者: Mango

Ruby模块

Ruby模块是方法和常量的集合。模块方法可以是实例方法或模块方法。

实例方法是包含模块时类中的方法。

可以在不创建封装对象的情况下调用模块方法,而在实例方法则不能。

它们与类相似,因为它们包含方法,类定义,常量和其他模块的集合。它们的定义类似于类。无法使用模块创建对象或子类。没有继承的模块层次结构。

模块基本上有两个作用:

  • 它们充当命名空间。它们可以防止名称冲突。
  • 它们允许mixin工具在类之间共享功能。

句法:

module ModuleName
   statement1
   statement2
   ...........
end

模块名称应以大写字母开头。

模块命名空间

在写入较大的文件时,会生成许多可重复使用的代码。这些代码被组织为类,可以将其插入文件中。

例如,如果两个人在不同文件中具有相同的方法名称。并且两个文件都需要包含在第三个文件中。然后可能会出现问题,因为两个包含文件中的方法名称相同。

在这里,模块机制发挥作用。模块定义了一个命名空间,您可以在其中定义方法和常量,而不会被其他方法和常量所取代。

例:

假设在file1.rb中,我们定义了许多不同类型的图书馆书籍,例如小说,恐怖片等。

在file2.rb中,我们定义了已读小说和已读小说(包括小说小说)的数量。

在file3.rb中,我们需要同时加载文件file1和file2。这里我们将使用模块机制。

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

file2.rb

#!/usr/bin/ruby 

# Module defined in file2.rb file 

module Novel 
   total = 123 
   read = 25 
   def Novel.fiction(left) 
   # ... 
   end 
end

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

在这里,模块名称由方法bella和ana组成。模块作业由方法编辑器和编写器组成。由于Combo类可以访问所有四个方法,因此Combo类包括两个模块。因此,类Combo用作mixin。

混合到类中的模块的方法可以是实例方法或类方法。这取决于您如何向类添加mixin。