`

ruby的模块

    博客分类:
  • ruby
阅读更多
模块的定义跟类非常相似,只是用module关键字取代class关键字而已。不过与类不同,模块不能被实例化,也不能被子类化。模块是独立的,在继承体系中没有任何所谓的“模块等级”。
模块对象是Module类的一个实例,所有的类都是模块,不过并非所有的模块都是类。

模块有些面向过程的感觉,有时候只需要一些方法,并不想定义类时,就可以使用模块。这时的模块主要起命名空间的作用。

Module Base64
    def self.encode
    end
    def self.decode
    end
end


其中self可以用当前的模块名替换。方法引用方式与类也是一样的
Base64.encode(text),常量也是用“模块名::常量名”的方式引用。

模块还有一种作用叫混入(mixin),如果一个模块定义了实例方法而非类方法,这些实例方法可以混入其它类中。Enumerable与Comparable是两个著名的混入模块。Enumberable模块定义了若干有用的迭代器,它们都基于each迭代器。Enumerable模块自身并没有定义each迭代器,但是如果混入Enumerable模块的类定义了迭代器,它就立刻具有这些强大的迭代器。Comparable也与此类似,它定义了一组比较操作符,后者都是基于通用比较符<=>的,如果你的类定义了<=>,那么混入Comparable模块后,它就能自动拥有<、<=、==、>、>=和between?这些操作符和方法。

想把一个模块混入一个类中, 我们必须使用include。include通常像一个关键字一样被使用:
class Point
    include Comparable
end

实际上,include是Module类的一个私有实例方法,它隐式地被self调用---在这里就是包含模块的类。如果使用方法的形式,上面的代码变为:

class Point
    include(Comparable)
end


include是私有方法,它必须以函数形式被调用,而不能写成self.include(Comparable)。include方法可以接受任意多的Module对象进行混入,因此一个定义了each和<=>的类可以加入下面的代码:

include Enumerable,Comparable


包含一个模块会影响is_a?这个类型检查方法及条件比较符===,在ruby1.8中,String混入了Comparable模块和Enumerable模块:
"text".is_a? Comparable #=>true
Enumerable==="text" #=>true in ruby 1.8,false in 1.9


注意instance_of?只对比接收者的类,而不管其超类或模块,所以下面的代码返回false:

"text".instance_of? Comparable #=>false


尽管每个类都是模块,但是include方法不允许把一类包含在另外一个类中,它的参数必须是用module进行声明的模块,而不能是类。

混入一个模块的普通方式是使用Module.include方法,另外一种方法则是使用Object.extend方法,这个方法使指定模块的实例方法成为接收对象的单键方法。(如果接收者对象是一个Class实例,那么这些方法就成为那个类的类方法)。如:
countdown=Object.new
#用来遍历
def coutdown.each
    yield 3
    yield 2
    yield 1
end
#获得Enumerable的方法
countdown.extend(Enumerable)
print countdown.sort #prints "[1,2,3]"


感觉上面这段代码意思说得不是很明确,其实主要区别在网上看来的:
引用
    * include : mixes in specified module methods as instance methods in the target class
    * extend : mixes in specified module methods as class methods in the target class


module ReusableModule
  def module_method
    puts "Module Method: Hi there!"
  end
end

class ClassThatIncludes
  include ReusableModule
end
class ClassThatExtends
  extend ReusableModule
end

puts "Include"
ClassThatIncludes.new.module_method       # "Module Method: Hi there!"
puts "Extend"
ClassThatExtends.module_method 


有点不同的是,如果实例extend了模块,那么里面的方法就是实例方法:
class InstanceThatExtends
end
ClassThatExtends.new.extend(ReusableModule).module_method

也就是说extend的即可以作实例方法,也可以作类方法,而include的只能是作实例方法。这也需要注意另一问题,上述情况的基准是module里面的都是实例方法。如果module里面出现了类方法,那么不应该用include或extends来使用,而应该直接用ModuleName.classMethod的方式来引用。大概解释与java差不多,类方法(静态方法)不被继承使用。
分享到:
评论

相关推荐

    08Ruby 模块.docx

    ### Ruby 模块详解 #### 一、Ruby 模块简介 在 Ruby 语言中,模块(Module)是一个非常重要的概念。它不仅提供了一种组织代码的有效方式,还支持一种称为 Mixin 的特殊继承机制。模块可以被视为一个容器,用于存放...

    Ruby:Ruby模块与包的深入理解与应用

    Ruby:Ruby模块与包的深入理解与应用

    ncurses-ruby, 用于访问ncurses库的ruby 模块.zip

    ncurses-ruby, 用于访问ncurses库的ruby 模块 ncurses红宝石用于访问ncurses库的ruby 模块概述这个自述文件解释了如何使用 ncurses ruby 接口。 假设读者对ncurses库的理解以及如何从C 语言中使用它有一个大致的理解...

    Ruby-ngxruby是嵌入ruby脚本的Nginx模块

    Nginx以其高性能、轻量级的特性被广泛用于处理静态内容和反向代理任务,而通过ngx_ruby模块,Nginx可以处理动态内容,提供更灵活的应用场景。 在Nginx配置文件中,可以使用ngx_ruby来定义服务器行为,例如处理HTTP...

    ruby 模块

    Ruby的模块非常类似类,除了: 模块不可以有实体 模块不可以有子类 模块由module…end定义. 实际上…模块的’模块类’是’类的类’这个类的父类.搞懂了吗?不懂?让我们继续看下去吧. 模块有两种用法.其一是将相近的...

    Ruby中使用SWIG编写ruby扩展模块实例

    在使用ruby/rails的过程中,确实发现有时性能不尽人意,如生成一个拥有600项的item的3层树形结构目录要花去20ms,为提高性能在学习用c/c++写ruby模块的过程中,认识了swig,rubyInline等一系列帮助编写c/c++来提升...

    Ruby-此模块将直接在注册表中更改本地用户的密码

    在描述中提到的“此模块将直接在注册表中更改本地用户的密码”,这暗示了一个特定的Ruby模块可能被设计用来操作Windows操作系统的注册表,这是一个存储系统设置和配置信息的关键数据库。注册表中包含有关用户账户和...

    Ruby-Capstone:这是我为Microverse的Ruby模块设计的单独项目

    Ruby帽石这是我对Microverse的Ruby模块的顶礼帽项目。 这是一个Web爬虫,旨在帮助您从获取文章。入门先决条件要运行此项目,您需要一台装有Ruby的计​​算机。 如果不确定如何安装Ruby,请查看制作的本。设置克隆存...

    textgem:与Textbelt API交互的Ruby模块

    文本框 这是一个ruby模块,可用于与textbelt api(textbelt.com)进行交互安装将此行添加到您的应用程序的Gemfile中: gem 'textgem' 然后执行: $ bundle install或将其自己安装为: $ gem install textgem用法...

    Ruby-qtbindings允许你在Ruby中使用QTGui工具包

    1. 源代码:项目的主要代码库,包括Ruby绑定的实现,可能分为多个文件和目录,如`lib/qtbindings`,其中包含了与QT库对应的Ruby模块和类。 2. 示例或测试:为了帮助开发者理解和使用qtbindings,可能会提供一些示例...

    AutoC:与自动C源代码生成相关的大量Ruby模块-开源

    AutoC是一个开源项目,主要由Ruby模块组成,专注于自动化C源代码的生成。这个工具集为开发者提供了一种高效的方法来处理C编程中的常见任务,尤其是对于那些涉及大量重复编码的工作,例如创建和管理数据结构。通过...

    rickgem:使用此Ruby模块获取过量的里克·阿斯特利(Rick Astley)的爱情

    Ruby模块带来了所有Rick Astley的爱。 安装 将此行添加到应用程序的Gemfile中: gem 'rickgem' 然后执行: $ bundle install 或将其自己安装为: $ gem install rickgem 用法 Rickgem . roll 发展 签出仓库后,...

    app-academy-hw-with-git:使用Git的App Academy Ruby模块数据结构家庭作业

    【标题】"app-academy-hw-with-git:使用Git的App Academy Ruby模块数据结构家庭作业"揭示了这个项目是一个关于学习和练习Ruby编程语言,特别是数据结构的课程作业,而且它利用Git作为版本控制工具。App Academy是...

    Ruby-PyCall从Ruby语言调用Python函数

    在上述示例中,`def_module`创建了一个Ruby模块,`def_add`定义了一个方法,该方法调用了Python的`add`函数。`PythonObject.new`用于创建一个Python对象,`send(:__)`则执行了Python函数并返回结果。 PyCall也支持...

    fluent-logger-ruby, 用于Fluentd的结构化记录器( ruby ).zip

    fluent-logger-ruby, 用于Fluentd的结构化记录器( ruby ) 录音机 结构化事件记录器示例简单require 'fluent-logger'log = Fluent::Logger::FluentLogger.new(nil, :host =&gt; 'localhost',

    Ruby基础语法+Ruby变量与数据类型+Ruby控制结构+Ruby函数与方法+Ruby面向对象编程等全套教程

    Ruby基础语法 Ruby变量与数据类型 ...Ruby模块与包 Ruby错误处理 Ruby文件与I/O操作 Ruby正则表达式 Ruby网络编程 Ruby数据库交互 Ruby测试框架 RubyWeb框架Rails入门 Ruby高级特性 Ruby性能优化与最佳实践

    gocron:轻松流畅的Go cron计划。这是来自https的分叉

    gocron是Golang实施Ruby模块的和Python的作业调度包。 另请参阅这两篇出色的文章: 如果您想聊天,可以在Slack找到我们! 概念 调度程序:调度程序跟踪分配给它的所有作业,并确保在准备运行时将其传递给执行程序...

    使用Ruby re模块创建复杂的正则表达式

    Ruby编程语言通过Re模块简化了构建复杂正则表达式的过程。 Re模块是Ruby中的一个库,专门用来辅助创建和管理正则表达式。使用Re模块,程序员可以以模块化的方式构建正则表达式,将一个复杂的表达式分解为多个小部分...

    ruby-fcgi-0.8.7.tar.gz_fcgi

    2. `lib`目录:存放Ruby FCGI库的源代码文件,例如`.rb`结尾的Ruby模块和类定义。 3. `examples`目录:可能包含一些使用Ruby FCGI的示例程序,帮助开发者理解和使用该库。 4. `INSTALL`或`setup.rb`:安装指南,可能...

Global site tag (gtag.js) - Google Analytics