Ruby 模块(Module)

  模块(Module)是一种把方法、类和常量组合在一起的方式。模块(Module)为您提供了两大好处。

  模块提供了一个命名空间和避免名字冲突。

  模块实现了 mixin 装置。

  模块(Module)定义了一个命名空间,相当于一个沙箱,在里边您的方法和常量不会与其他地方的方法常量冲突。

  语法

  module Identifier

  statement1

  statement2

  ...........

  end

  模块常量命名与类常量命名类似,以大写字母开头。方法定义看起来也相似:模块方法定义与类方法定义类似。

  通过类方法,您可以在类方法名称前面放置模块名称和一个点号来调用模块方法,您可以使用模块名称和两个冒号来引用一个常量。

  实例

  #!/usr/bin/ruby

  # 定义在 trig.rb 文件中的模块

  module Trig

  PI = 3.141592654

  def Trig.sin(x)

  # ..

  end

  def Trig.cos(x)

  # ..

  end

  end

  我们可以定义多个函数名称相同但是功能不同的模块:

  #!/usr/bin/ruby

  # 定义在 moral.rb 文件中的模块

  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 中的 Mixins

  在阅读本节之前,您需要初步了解面向对象的概念。

  当一个类可以从多个父类继承类的特性时,该类显示为多重继承。

  Ruby 不直接支持多重继承,但是 Ruby 的模块(Module)有另一个神奇的功能。它几乎消除了多重继承的需要,提供了一种名为 mixin 的装置。

  Mixins 向您提供了一种完美的为类添加功能的控制方式。但是,它们真正的强大在于当 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 。(编辑:雷林鹏 来源:网络)

雷林鹏分享:Ruby 模块(Module)的更多相关文章

  1. 雷林鹏分享:Ruby 循环

    Ruby 循环 Ruby 中的循环用于执行相同的代码块若干次.本章节将详细介绍 Ruby 支持的所有循环语句. Ruby while 语句 语法 while conditional [do] code ...

  2. 雷林鹏分享:Ruby 变量

    Ruby 变量 变量是持有可被任何程序使用的任何数据的存储位置. Ruby 支持五种类型的变量.您已经在前面的章节中大概了解了这些变量,本章节将为您详细讲解这五种类型的变量. Ruby 全局变量 全局 ...

  3. 雷林鹏分享:Ruby 运算符

    Ruby 运算符 Ruby 支持一套丰富的运算符.大多数运算符实际上是方法调用.例如,a + b 被解释为 a.+(b),其中指向变量 a 的 + 方法被调用,b 作为方法调用的参数. 对于每个运算符 ...

  4. 雷林鹏分享:Ruby 方法

    Ruby 方法 Ruby 方法与其他编程语言中的函数类似.Ruby 方法用于捆绑一个或多个重复的语句到一个单元中. 方法名应以小写字母开头.如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常 ...

  5. 雷林鹏分享:Ruby 环境变量

    Ruby 环境变量 Ruby 解释器使用下列环境变量来控制它的行为.ENV 对象包含了所有当前设置的环境变量列表. 变量描述 DLN_LIBRARY_PATH动态加载模块搜索的路径. HOME当没有参 ...

  6. 雷林鹏分享:Ruby 数组(Array)

    Ruby 数组(Array) Ruby 数组是任何对象的有序的.整数索引的集合.数组中的每个元素都与一个索引相关,并可通过索引进行获取. 数组的索引从 0 开始,这与 C 或 Java 中一样.一个负 ...

  7. 雷林鹏分享:Ruby 文件的输入与输出

    Ruby 文件的输入与输出 Ruby 提供了一整套 I/O 相关的方法,在内核(Kernel)模块中实现.所有的 I/O 方法派生自 IO 类. 类 IO 提供了所有基础的方法,比如 read. wr ...

  8. 雷林鹏分享:Ruby 异常

    Ruby 异常 异常和执行总是被联系在一起.如果您打开一个不存在的文件,且没有恰当地处理这种情况,那么您的程序则被认为是低质量的. 如果异常发生,则程序停止.异常用于处理各种类型的错误,这些错误可能在 ...

  9. 雷林鹏分享:Ruby 数据库访问 - DBI 教程

    Ruby 数据库访问 - DBI 教程 本章节将向您讲解如何使用 Ruby 访问数据库.Ruby DBI 模块为 Ruby 脚本提供了类似于 Perl DBI 模块的独立于数据库的接口. DBI 即 ...

随机推荐

  1. uva1411 最小值转最大值+二分图匹配

    这题给了n个白点和n个黑点坐标,计算出他们两两配对的总路程最少, 我们算出他们之间的距离,为d,然后 w[j][i]=-d; 就将求最小值转化为求最大值,然后采用km进行匹配计算 #include & ...

  2. 【Redis学习之三】Redis单节点安装

    本文介绍两个版本:redis-2.8.18.tar.gz 和 redis-3.0.0-rc2.tar.gz,均采用源码安装方式 一.redis3.0 部署环境 redis-3.0.0-rc2.tar. ...

  3. ThinkPHP问题收集:模板中使用U方法时无法嵌套大括号,For标签,插入数据,新增的表字段缓存问题

    ThinkPHP模板中使用U方法时无法嵌套大括号需要在control里面用U方法赋值给变量传到模版如:{:U('/Blog/comment/',array('id'=>$id)}$comment ...

  4. python基础五--dict

    一.昨日内容回顾 1. 列表: 增 insert:按照指定下标插入 append:在列表最后增加 extend:迭代式的增加到列表的最后,相当于列表扩展 删 pop:根据指定下标删除,返回删除的元素, ...

  5. Mysql错误:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

    昨晚添加完索引之后, 查询整表的时候抛出Lock wait timeout exceeded; try restarting transaction, 吓死小白的我, 为什么条件查询可以, 整表查不了 ...

  6. php 设置模式 单元素模式(单例模式或单件模式)

    单元素模式: 某些应用程序资源是独占的,因为有且只有一个此类型的资源.应用程序每次包含且仅包含一个对象,那么这个对象就是一个单元素.指的是在应用程序的范围内只对指定的类创建一个实例.通常该模式中包含一 ...

  7. 20145314郑凯杰《网络对抗技术》恶意DLL注入进程(进程捆绑)的实现

    20145314郑凯杰<网络对抗技术>恶意DLL注入进程(进程捆绑)的实现 一.本节摘要 简介:在这部分里,要实现将恶意后门悄无声息地与进程进行捆绑,通过和已运行的进程进行捆绑,达到附着攻 ...

  8. C++ 文件大小格式化

    #include <iostream> #include <windows.h> using namespace std; /*文件大小格式化 *param [in] dwSi ...

  9. Win10 Edge浏览器怎么重装 Win10重装Edge浏览器

    具体如下: 重新安装Microsoft Edge 1.按Windows键+ R,打开 输入以下代码,可以直接复制黏贴. %LocalAppData%\Packages\Microsoft.Micros ...

  10. Java DecimalFormat 用法(数字格式化)

    我们经常要将数字进行格式化,比如取2位小数,这是最常见的.Java 提供 DecimalFormat 类,帮你用最快的速度将数字格式化为你需要的样子.下面是常用的例子: import java.tex ...