Ruby模块(module)
Ruby 和 Java 一样支持单继承,也正如 Java 引入 interface 来解决多继承的两难问题一样,Ruby 也提供了单继承和多继承的妥协机制:即模块。
模块的定义和类比较相似,使用module关键字。但模块不能被实例化,也不能被子类化,模块是独立的,且一个模块对像是Module类的一个实例。在模块中,可以定义实例变量、实例方法、类变量、类方法和属性等,并且在模块中还可能以定义类和模块。在类中也可以定义模块。 但是,必须被类引用才能使用模块内容。
模块最常用的两个用途是作为命空间和混入(mixin)。
加载和请求模块
有时由于项目需要会把不同的类或模块存放在不同的文件中,在使用这些文件时,就要用 load 和 require 来加载这些文件。在使用文件中的模块和对象时,还需要使用 include 和 extend 方法。
1、require 和 load的区别:
比较项目 |
load |
require |
参数 |
文件名称包含扩展名 |
只需传入库的名字,不需要后缀 |
加载次数 |
可以把同一文件加载多次 |
一个文件最多只加载一次 |
作用 |
相当于复制粘贴 |
不仅可加载ruby源文件,也可加载其他语言源文件 |
2、include方法
该方法主要用来将一个模块包含到(混入)一个类或者其它模块。在类定义中引入模块,使模块中的方法成为类的实例方法;这个模块的方法在引入它的类或模块中以函数的形式调用,include 并非将模块的实例方法简单拷贝到类中,而是建立了一个类到模块的引用。例如:
# 模块文件名为:TestModule
module Foo
def hello
puts "This is my first module in Ruby!"
end
end # 另有一个类文件名为:Test
# Test类和TestModule模块在同一路径下
#require "D:/cucumber/Ruby/TestModule" #(加载文件)绝对路径
require "../Ruby/TestModule" #(加载文件)相对路径 class TestOne
include Foo #混入模块
def hi
puts "This is a class"
end
end a=TestOne.new
a.hi
a.hello
3、extend方法
extend 用来在一个对象(object,或者说是instance)中引入一个模块,这类从而也具备了这个模块的方法,例如:
# 定义模块 module FirstModule
def helloMod
puts "This is a module."
end
end # 定义类
class FirstClass
def helloClass
puts "This is a class."
end
end c = FirstClass.new
c.helloClass # 调用类方法
c.extend( FirstModule ) # 对象引入模块
c.helloMod # 调用模块方法
4、加载路径
Ruby的加载路径是一个数组,可以使用全局变量$LOAD_PATH 或 $:进行访问。数组的每个元素都是一个目录史,ruby在这些目录中查找加载的文件,前面的目录比后面的目录优选被查找;可以使用 puts $: 输出路径;Ruby程序也可以通过修改$LOAD_PATH($:)数组的内容来修改加载路径。例如:
puts $:
$:<<"../.."# 修改加载路径的值
puts"@@@@@@@"
puts $:
当然,对load或require使用绝对路径,完全绕过加载路径。
Ruby模块(module)的更多相关文章
- 雷林鹏分享:Ruby 模块(Module)
Ruby 模块(Module) 模块(Module)是一种把方法.类和常量组合在一起的方式.模块(Module)为您提供了两大好处. 模块提供了一个命名空间和避免名字冲突. 模块实现了 mixin 装 ...
- python中根据字符串导入模块module
python中根据字符串导入模块module 需要导入importlib,使用其中的import_module方法 import importlib modname = 'datetime' date ...
- Python 模块(module)
模块(module)也是为了同样的目的.在Python中,一个.py文件就构成一个模块.通过模块,你可以调用其它文件中的程序. first.py def laugh(): print "Ha ...
- python模块module package
python模块module package module package 常用模块 模块与包的区别 模块分为内置模块.第三方模块,自定义模块 程序会先从内置到第三方再到当前工作目录下去找你导入的 ...
- Yii2 模块module笔记
包含内容: 使用GII新建module 建立子模块 在其他控制器中调用模块的操作(action) 1. 使用Gii工具新建module 注意模块的路径,我们没有写backend\modules\Art ...
- webpack新版本4.12应用九(配置文件之模块(module))
这些选项决定了如何处理项目中的不同类型的模块. module.noParse RegExp | [RegExp] RegExp | [RegExp] | function(从 webpack 3.0. ...
- python2.7入门---模块(Module)
来,这次我们就看下Python 模块(Module).它是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句.模块让你能够有逻辑地组织你的 Pytho ...
- 21.python的模块(Module)和包(Package)
目录 模块(Module)和包(Package) 模块(modue)的概念 模块导入方法 1.import 语句 2.from-import 语句 3.from-import* 语句 4.运行本质 i ...
- python--包package、模块module、类Class、Mixin类(未完成)
包package>模块module>类Class(包含了属性.方法.实例等概念) 模式一:一个包下面有多个py文件,即多个模块module 模式二:一个包下面包含多个子包packages ...
随机推荐
- Linux安装python3.7.2详细操作步骤
1.下载Python依赖环境 yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ...
- python数据分析之:数据聚合与分组运算
在数据库中,我们可以对数据进行分类,聚合运算.例如groupby操作.在pandas中同样也有类似的功能.通过这些聚合,分组操作,我们可以很容易的对数据进行转换,清洗,运算.比如如下图,首先通过不同的 ...
- VMware Integrated OpenStack (VIO)简介
VMware Integrated OpenStack是一款由VMware提供支持的OpenStack发行版软件,用于帮助IT在现有的VMware基础架构之上更加轻松地运行基于生产级OpenStack ...
- docker swarm部署spring cloud服务
一.准备docker swarm的集群环境 ip 是否主节点 192.168.91.13 是 192.168.91.43 否 二.准备微服务 ①eureka服务 application.y ...
- 阿里云 rails nginx 配置https访问
1.申请免费型dv ssl证书:https://common-buy.aliyun.com/?spm=a2c4e.11155515.0.0.7zzvOZ&commodityCode=cas#/ ...
- MD5加密“破解”在.NET平台实现最基本的理解
MD5作为一种散列算法,广泛用于密码传输过程中的“加密”(引号的意思是这并不是真正的加密,而是形成密码的散列值)过程.MD顾名思义Message Digest(报文摘要),可以将输入的密码,一般来说为 ...
- delphi的获取某坐标的颜色值
1.通过API函数GetPixel(),获取某个点的颜色值; var PT : TPoint; C : TColor; DC : HDC; hwd : THandle; I : integer; be ...
- Spring Cloud之Feigin客户端重构思想
应该重构接口信息(重点) toov5-parent 存放共同依赖信息 toov5-api api的只有接口没有实现 toov5-api-member toov5-api-order to ...
- castle windsor学习-----Fluent Registration API 注册
使用xml配置和fluent注册两种搭配使用需要注意的是: 如果先在WindsorContainer构造函数指明用xml配置进行注册,如下设置 IWindsorContainer container ...
- 囤题&&发布记录
声明 && 温馨提示 by ljh2000 听说有人很喜欢狙我......看我不把你们抓起来嘿嘿嘿! 为了采取措施,不让被狙成为生活常态(雾 ,我要闭关锁国辣,我要开始(屯田)囤题 ...