开发手册 欢迎您!
软件开发者资料库

Ruby - 模块和混合

Ruby模块和Mixins - 从简单和简单的步骤学习Ruby,从基本到高级概念,包括概述,环境设置,语法,类,变量,运算符,注释,If ... else,case,除非,循环,文件, I / O,函数,对象,TK,范围,迭代器,数组,字符串,方法,块,异常,面向对象,正则表达式,DBI,多线程,哈希,日期和时间,模块,LDAP,Web服务,Web编程,发送电子邮件,套接字编程,脚本语言,预定义常量,关联工具。

模块是一种将方法,类和常量分组在一起的方法.模块为您带来两大好处.

  • 模块提供命名空间并防止名称冲突.

  • 模块实现 mixin 工具.

模块定义一个命名空间,一个沙箱,你的方法和常量可以在其中播放,而不必担心被其他方法和常量踩到.

语法

module Identifier   statement1   statement2   ...........end

模块常量的命名与类常量一样,带有一个初始大写字母.方法定义也类似:模块方法的定义与类方法类似.

与类方法一样,通过在模块名称和句点之前加上名称来调用模块方法,并使用模块名称和两个冒号引用常量.

示例

#!/usr/bin/ruby# Module defined in trig.rb filemodule Trig   PI = 3.141592654   def Trig.sin(x)   # ..   end   def Trig.cos(x)   # ..   endend

我们可以定义一个具有相同功能名称但功能不同的负模块;

#!/usr/bin/ruby# Module defined in moral.rb filemodule Moral   VERY_BAD = 0   BAD = 1   def Moral.sin(badness)   # ...   endend

与类方法类似,无论何时定义方法模块,您指定模块名称后跟一个点,然后指定方法名称.

Ruby require语句

require语句类似于include C和C ++的声明以及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 Statement

您可以在一个类中嵌入一个模块.要在类中嵌入模块,可以在类&minus中使用 include 语句;

语法

include modulename

如果模块是在单独的文件中定义的,则需要使用包含该文件在将模块嵌入类之前需要语句.

示例

考虑用 support.rb编写的以下模块 file.

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"   endend

现在,您可以将此模块包含在类中,如下所示;

#!/usr/bin/ruby$LOAD_PATH << '.'require "support"class Decadeinclude Week   no_of_yrs = 10   def no_of_months      puts Week::FIRST_DAY      number = 10*12      puts number   endendd1 = Decade.newputs Week::FIRST_DAYWeek.weeks_in_monthWeek.weeks_in_yeard1.no_of_months

这将产生以下结果 :

SundayYou have four weeks in a monthYou have 52 weeks in a yearSunday120

Ruby中的Mixins

在完成本节之前,我们假设您具有面向对象概念的知识.

当一个类可以从多个父类继承特性时,该类应该显示多个继承.

Ruby不直接支持多重继承,但Ruby Modules有另一个很好的用途.一下子,它们几乎消除了对多重继承的需求,提供了一个名为 mixin 的工具.

Mixins为您提供了一种奇妙的控制方式来添加功能类.然而,当mixin中的代码开始与使用它的类中的代码交互时,它们的真正力量就会出现.

让我们检查以下示例代码以了解mixin&minus ;

module A   def a1   end   def a2   endendmodule B   def b1   end   def b2   endendclass Sampleinclude Ainclude B   def s1   endendsamp = Sample.newsamp.a1samp.a2samp.b1samp.b2samp.s1

模块A由方法a1和a2组成.模块B由方法b1和b2组成.类Sample包括模块A和B.类Sample可以访问所有四种方法,即a1,a2,b1和b2.因此,您可以看到类Sample继承自两个模块.因此,您可以说类Sample显示多重继承或 mixin .

s.parentNode.insertBefore(hm, s); })(); k.51.la/js-sdk-pro.min.js">