雷林鹏分享:Ruby 模块(Module)

  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 。(编辑:雷林鹏 来源:网络)

原文地址:https://www.cnblogs.com/pengpeng1208/p/10208158.html

时间: 2024-07-29 16:41:33

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

雷林鹏分享:Ruby JSON

Ruby JSON 本章节我们将为大家介绍如何使用 Ruby 语言来编码和解码 JSON 对象. 环境配置 在使用 Ruby 编码或解码 JSON 数据前,我们需要先安装 Ruby JSON 模块.在安装该模块前你需要先安装 Ruby gem,我们使用 Ruby gem 安装 JSON 模块. 但是,如果你使用的是最新版本的 Ruby,可能已经安装了 gem,解析来我们就可以使用以下命令来安装Ruby JSON 模块: $gem install json 使用 Ruby 解析 JSON 以下为J

雷林鹏分享:Ruby 异常

Ruby 异常 异常和执行总是被联系在一起.如果您打开一个不存在的文件,且没有恰当地处理这种情况,那么您的程序则被认为是低质量的. 如果异常发生,则程序停止.异常用于处理各种类型的错误,这些错误可能在程序执行期间发生,所以要采取适当的行动,而不至于让程序完全停止. Ruby 提供了一个完美的处理异常的机制.我们可以在 begin/end 块中附上可能抛出异常的代码,并使用 rescue 子句告诉 Ruby 完美要处理的异常类型. 语法 begin # - rescue OneTypeOfExce

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

Ruby 文件的输入与输出 Ruby 提供了一整套 I/O 相关的方法,在内核(Kernel)模块中实现.所有的 I/O 方法派生自 IO 类. 类 IO 提供了所有基础的方法,比如 read. write. gets. puts. readline. getc 和 printf. 本章节将讲解所有 Ruby 中可用的基础的 I/O 函数.如需了解更多的函数,请查看 Ruby 的 IO 类. puts 语句 在前面的章节中,您赋值给变量,然后使用 puts 语句打印输出. puts 语句指示程序

雷林鹏分享:Lua 模块与包

模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度. Lua 的模块是由变量.函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量.函数放入其中,最后返回这个 table 就行.以下为创建自定义模块 module.lua,文件代码格式如下: -- 文件名为 module.lua -- 定义一个名为 modul

雷林鹏分享:Ruby 多线程

Ruby 多线程 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程. 线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程. Ruby 中我们可以通过 Thread 类来创建多线程,Ruby的线程是一个轻量级的,可以以高效的方式来实现并行的代码. 创建 Ruby 线程 要启动一个新的线程,只需要调用 Thread.new 即可: # 线程 #1 代码部分 Thread.new { # 线程 #2 执行代码 } # 线程 #1 执行代码 实例 以

雷林鹏分享:Ruby CGI方法

Ruby CGI方法 以下为CGI类的方法列表: 序号方法描述 1CGI::new([ level="query"]) 创建 CGI 对象.query可以是以下值: query: 没有 HTML 生成输出 html3: HTML3.2 html4: HTML4.0 Strict html4Tr: HTML4.0 Transitional html4Fr: HTML4.0 Frameset 2CGI::escape( str) 使用 URL 编码来转义字符串 3CGI::unescape

雷林鹏分享:Ruby 面向对象

Ruby 面向对象 Ruby 是纯面向对象的语言,Ruby 中的一切都是以对象的形式出现.Ruby 中的每个值都是一个对象,即使是最原始的东西:字符串.数字,甚至连 true 和 false 都是对象.类本身也是一个对象,是 Class 类的一个实例.本章将向您讲解所有与 Ruby 面向对象相关的主要功能. 类用于指定对象的形式,它结合了数据表示法和方法,把数据整理成一个整齐的包.类中的数据和方法被称为类的成员. Ruby 类定义 当您定义一个类时,您实际是定义了一个数据类型的蓝图.这实际上并没

雷林鹏分享:Ruby File 类和方法

Ruby File 类和方法 File 表示一个连接到普通文件的 stdio 对象.open 为普通文件返回该类的一个实例. 类方法 序号方法 & 描述 1File::atime( path) 返回 path 的最后访问时间. 2File::basename( path[, suffix]) 返回 path 末尾的文件名.如果指定了 suffix,则它会从文件名末尾被删除. 例如:File.basename("/home/users/bin/ruby.exe") #=>

雷林鹏分享:Ruby 日期 &amp; 时间(Date &amp; Time)

Ruby 日期 & 时间(Date & Time) Time 类在 Ruby 中用于表示日期和时间.它是基于操作系统提供的系统日期和时间之上.该类可能无法表示 1970 年之前或者 2038 年之后的日期. 本教程将让您熟悉日期和时间的所有重要的概念. 创建当前的日期和时间 下面是获取当前的日期和时间的简单实例: #!/usr/bin/ruby -w time1 = Time.new puts "Current Time : " + time1.inspect # Ti