- 第1节:Ruby 简介
- 第2节:Ruby 环境
- 第3节:Ruby 安装 – Unix
- 第4节:Ruby 安装 – Windows
- 第5节:Ruby 中文编码
- 第6节:Ruby 命令行选项
- 第7节:Ruby 环境变量
- 第8节:Ruby 语法
- 第9节:Ruby 数据类型
- 第10节:Ruby 类和对象
- 第11节:Ruby 类案例
- 第12节:Ruby 变量
- 第13节:Ruby 运算符
- 第14节:Ruby 注释
- 第15节:Ruby 条件判断
- 第16节:Ruby 循环
- 第17节:Ruby 方法
- 第18节:Ruby 块
- 第19节:Ruby 模块(Module)
- 第20节:Ruby 字符串(String)
- 第21节:Ruby 数组(Array)
- 第22节:Ruby 哈希(Hash)
- 第23节:Ruby 日期 & 时间(Date & Time)
- 第24节:Ruby 范围(Range)
- 第25节:Ruby 迭代器
- 第26节:Ruby 文件的输入与输出
- 第27节:Ruby File 类和方法
- 第28节:Ruby Dir 类和方法
- 第29节:Ruby 异常
- 第30节:Ruby 面向对象
- 第31节:Ruby 正则表达式
- 第32节:Ruby 数据库访问 – DBI 教程
- 第33节:Ruby 连接 Mysql – MySql2
- 第34节:Ruby CGI 编程
- 第35节:Ruby CGI方法
- 第36节:Ruby CGI Cookies
- 第37节:Ruby CGI Sessions
- 第38节:Ruby 发送邮件 – SMTP
- 第39节:Ruby Socket 编程
- 第40节:Ruby XML, XSLT 和 XPath 教程
- 第41节:Ruby Web Services 应用 – SOAP4R
- 第42节:Ruby 多线程
- 第43节:Ruby JSON
- 第44节:Ruby RubyGems
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
就像类方法,当您在模块中定义一个方法时,您可以指定在模块名称后跟着一个点号,点号后跟着方法名。
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 来从一个相对目录引用文件。
注意:在这里,文件包含相同的函数名称。所以,这会在引用调用程序时导致代码模糊,但是模块避免了这种代码模糊,而且我们可以使用模块的名称调用适当的函数。
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 。