`

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差不多,类方法(静态方法)不被继承使用。
分享到:
评论

相关推荐

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

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

    08Ruby 模块.docx

    Ruby是一种动态、面向对象的编程语言,它具有简洁、易读的语法,被称为“程序员最好的朋友”。Ruby具有强大的元编程能力,允许开发者在运行时动态修改和生成代码。Ruby还有一个强大的标准库,提供了丰富的工具和功能...

    ruby 模块

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

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

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

    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用法...

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

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

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

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

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

    该软件包包含与自动C源代码生成相关的Ruby模块。 当前功能包括:*多源C模块生成器*用于矢量,列表,集合和映射的强类型数据结构生成器

    frankly-ruby:用于使用Frankly API的Ruby模块

    #坦率地说Ruby SDK Ruby gem通过与Frankly的服务器API交互以管理房间,消息和用户,轻松地在应用中创建更深入的Frankly聊天集成。 ###安装 在您的Gemfile中包括 gem 'frankly-ruby', :git =&gt; 'git://github....

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

    ngx_ruby 是嵌入 ruby 脚本的 Nginx 模块

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

    复杂的正则表达式很难构建,甚至很难阅读。Ruby的Re模块可以帮助你利用简单的表达式构建复杂的正则表达式

    rvm-1.29.12.tar.gz

    它可以管理不同版本的 RubyGems、Ruby 模块,甚至可以在不同的版本之间比较它们的功能。 另外,我们还可以使用 rvm list known 命令来列出当前可用的所有 Ruby 版本,便于对它们的管理。 总的来说,RVM 是一个非常...

    Enumerable-Methods:这是Microverse中Ruby模块的项目#2

    该项目包含以下Ruby枚举方法的我自己版本的实现: 每个; 每个都有索引; 选择; 全部?; 任何?; 没有?; 数数; 地图; 注入。 如果您对上述方法之一有任何疑问,请考虑检查文件。 现场演示 这是该项目中...

    从Ruby语言调用Python函数-Ruby开发

    您可以将任意Python模块导入Ruby模块,通过从Ruby到Python的自动类型转换来调用Python函数。 支持的Ruby版本pycall.rb支持Ruby 2.3或更高版本。 支持的Python版本pycall.rb支持Python 2.7或更高版本。 请注意,在...

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

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

    Ruby-Rack一个模块化的Ruby服务器接口

    Rack提供了一个最小化,模块化和适应性强的界面,用于在Ruby中开发Web应用程序。 通过以最简单的方式包装HTTP请求和响应,它将Web服务器,Web框架和软件(所谓的中间件)之间的API统一并提炼成单个方法调用。

    编译ruby用到依赖模块(for windows)

    编译ruby用到依赖模块(for windows)~~~~

    hFilter:一个简单的Ruby模块,用于信号处理

    筛选器 滤波器是信号处理中的基本概念。 过滤器反复获取输入值并产生输出值。 类层次结构 筛选 筛选级联 身份过滤器 比较过滤器 MaxFilter(输入,n = nil) MinFilter(输入,n = nil) MeanFilter(输入,n = ...

    在ruby中记录传出的HTTP请求-Ruby开发

    帮助调试讨厌的API错误响应,或者只是大致了解幕后情况。 到目前为止,由于此问题,此宝石...此gem与以下ruby模块和库一起使用:Net :: HTTP Ethon Excon Opencon Patron HTTPClient HTTParty HTTP这些库至少是一部分

Global site tag (gtag.js) - Google Analytics