- Ruby 基础
- Ruby - 首页
- Ruby - 概述
- Ruby - 环境设置
- Ruby - 语法
- Ruby - 类和对象
- Ruby - 变量
- Ruby - 运算符
- Ruby - 注释
- Ruby - IF...ELSE
- Ruby - 循环
- Ruby - 方法
- Ruby - 代码块
- Ruby - 模块
- Ruby - 字符串
- Ruby - 数组
- Ruby - 哈希表
- Ruby - 日期和时间
- Ruby - 范围
- Ruby - 迭代器
- Ruby - 文件 I/O
- Ruby - 异常
Ruby - 模块和Mixin
模块是将方法、类和常量组合在一起的一种方式。模块为您提供了两个主要好处。
模块提供了一个命名空间,并防止命名冲突。
模块实现了Mixin功能。
模块定义了一个命名空间,一个沙盒,您的方法和常量可以在其中运行,而无需担心被其他方法和常量覆盖。
语法
module Identifier statement1 statement2 ........... end
模块常量与类常量的命名方式相同,以大写字母开头。方法定义也看起来很相似:模块方法的定义方式与类方法相同。
与类方法一样,您可以通过在模块名称前加上模块名称和一个句点来调用模块方法,并且您可以使用模块名称和两个冒号来引用常量。
示例
#!/usr/bin/ruby # Module defined in trig.rb file module Trig PI = 3.141592654 def Trig.sin(x) # .. end def Trig.cos(x) # .. end end
我们可以使用相同的函数名称但功能不同的定义另一个模块 -
#!/usr/bin/ruby # Module defined in moral.rb file module Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) # ... end end
与类方法一样,每当您在模块中定义方法时,您都指定模块名称,后跟一个点,然后是方法名称。
Ruby require 语句
require 语句类似于 C 和 C++ 的 include 语句以及 Java 的 import 语句。如果第三个程序想要使用任何已定义的模块,它只需使用 Ruby 的require语句加载模块文件 -
语法
require filename
这里不需要在文件名后面加上.rb扩展名。
示例
$LOAD_PATH << '.' require 'trig.rb' require 'moral' y = Trig.sin(Trig::PI/4) wrongdoing = Moral.sin(Moral::VERY_BAD)
这里我们使用$LOAD_PATH << '.'让 Ruby 知道必须在当前目录中搜索包含的文件。如果您不想使用 $LOAD_PATH,则可以使用require_relative从相对目录中包含文件。
重要 - 这里,这两个文件都包含相同的函数名称。因此,这将导致在包含调用程序时代码出现歧义,但模块避免了这种代码歧义,并且我们能够使用模块名称调用相应的函数。
Ruby include 语句
您可以将模块嵌入到类中。要将模块嵌入到类中,您可以在类中使用include语句 -
语法
include modulename
如果模块是在单独的文件中定义的,则需要在将模块嵌入到类中之前使用require语句包含该文件。
示例
考虑以下在support.rb文件中编写的模块。
module Week FIRST_DAY = "Sunday" def Week.weeks_in_month puts "You have four weeks in a month" end def Week.weeks_in_year puts "You have 52 weeks in a year" end end
现在,您可以按如下方式将此模块包含在类中 -
#!/usr/bin/ruby $LOAD_PATH << '.' require "support" class Decade include Week no_of_yrs = 10 def no_of_months puts Week::FIRST_DAY number = 10*12 puts number end end d1 = Decade.new puts Week::FIRST_DAY Week.weeks_in_month Week.weeks_in_year d1.no_of_months
这将产生以下结果 -
Sunday You have four weeks in a month You have 52 weeks in a year Sunday 120
Ruby 中的 Mixin
在阅读本节之前,我们假设您了解面向对象的概念。
当一个类可以从多个父类继承特征时,该类应该表现出多重继承。
Ruby 不直接支持多重继承,但 Ruby 模块还有另一种奇妙的用途。它们一举消除了对多重继承的需求,提供了名为Mixin的功能。
Mixin 为您提供了一种非常可控的方式来向类添加功能。但是,当 Mixin 中的代码开始与使用它的类中的代码交互时,它们的真正威力就会显现出来。
让我们检查以下示例代码以了解 Mixin -
module A def a1 end def a2 end end module B def b1 end def b2 end end class Sample include A include B def s1 end end samp = Sample.new samp.a1 samp.a2 samp.b1 samp.b2 samp.s1
模块 A 包含方法 a1 和 a2。模块 B 包含方法 b1 和 b2。类 Sample 包含模块 A 和 B。类 Sample 可以访问所有四个方法,即 a1、a2、b1 和 b2。因此,您可以看到类 Sample 从这两个模块继承。因此,您可以说类 Sample 显示多重继承或Mixin。