ruby基础(四)
ruby基础知识
模块
模块是ruby的特色功能之一。如果说类是事物的实体以及行为,那么模块表现的
就是事物的行为部分,模块和类有以下两点不同:
- 模块不能拥有实例
- 模块不能被继承
模块的使用方法
module Mymodule
#共同的方法
end
class Myclass1
include Mymodule
#Myclass1独有的方法
end
class Myclass2
include Mymodule
#Myclass2独有的方法
end
使用模块可以灵活的解决下面的问题
- 虽然两个类拥有相同的功能,但是不希望他们作为相同的种类来考虑
- Ruby不支持父类多重继承。
ruby中模块会提供独立的命名空间,一个模块的方法、变量和另一个模块的方法、
变量是不同的。
模块函数
使用模块名.方法名的形式来调用模块中方法,这样的方法称为模块函数。
#检查文件是否存在
p FileTest.exist?("/user/bin/ruby") #false
#圆周率常量
p Math::PI #3.141592653589793
使用include方法把模块内的方法名、常量名合并到当前的命名空间中
include Math
p PI #3.141592653589793
p sqrt 2 #1.4142135623730951
创建模块
module 模块名
模块定义
end
模块的名字必须大写。eg:
module Helloworld
Version="1.0"
def hello(name)
puts "hello,#{name}."
end
#指定模块函数
module_function :hello
end
Helloworld.hello("ruby") #hello,ruby.
p Helloworld::Version #"1.0"
include Helloworld #包含模块
p Version #"1.0"
hello "ruby" #hello,ruby
和类一样,在模块中定义的常量可以用模块名访问
p Helloworld::Version #"1.0"
方法调用
如果只定义了方法,可以在模块内调用和包含该模块的语句中使用,但是不能以
“模块.方法名”调用,如果想要这样使用,可以这样在模块中使用 module_function
方法。
module_function :hello
以“模块.方法名”调用,方法中的self指向模块对象,如果将模块包含今类中
,则该方法变成了类的实例方法,self指向类的实例。
module Helloworld
Version="1.0"
def hello
self
end
#指定模块函数
module_function :hello
end
p Helloworld.hello #Helloworld
module Helloworld
Version="1.0"
def hello
self
end
end
class Foo
include Helloworld
def aaa
puts "I am aaa"
end
end
foo=Foo.new()
p foo.hello # #<Foo:0x0055c23667a338>
想要知道类是否包含某个模块,可以使用include?方法
module Helloworld
Version="1.0"
def hello
self
end
end
class Foo
include Helloworld
def aaa
puts "I am aaa"
end
end
p Foo.include? Helloworld #true
类的实例在调用方法的时候,会按照类、包含的模块、父类的顺序查找方法。
被包含的模块相当于类的虚拟父类。
使用ancestors方法和superclass方法调查类的继承关系
module Helloworld
Version="1.0"
def hello
self
end
end
class Foo
include Helloworld
def aaa
puts "I am aaa"
end
end
p Foo.superclass #Object
p Foo.ancestors #[Foo, Helloworld, Object, Kernel, BasicObject]
p Object.ancestors #[Object, Kernel, BasicObject]
p Object.superclass #BasicObject
p BasicObject.superclass #nil
p BasicObject.ancestors #[BasicObject]
p Class.superclass #Module
p Class.ancestors #[Class, Module, Object, Kernel, BasicObject]
p Module.superclass #Object
p Module.ancestors #[Module, Object, Kernel, BasicObject]
我们看出Object的父类是BasicObject.
Class的父类是Module,Module的父类是Object.
包含模块时查找方法的顺序
- 原类中方法优先级高于包含模块的
- 类中包含多个模块,优先使用最后包含的模块
- 多个模块,模块中包含模块,优先使用最后一个模块和模块中包含的模块。
- 相同模块第二次包含会被省略。
可以使用ancestors查看方法的顺序。
extend方法
Obejct#extend的方法用来给对象扩展功能
module Helloworld
Version="1.0"
def hello
self
end
end
str="ruby"
str.extend Helloworld
p str.hello #"ruby"
ruby中的类方法:Class类的实例方法,类对象的单例方法。使用extend
方法给类添加类方法。
eg:include给对象添加实例方法,extend给类添加类方法。
module Instance_Method
Version="1.0"
def hello
puts "hello"
end
end
module Class_Method
def say
"Ruby"
end
end
class Hello
include Instance_Method
extend Class_Method
end
p Hello.say #"Ruby"
Hello.new.hello #hello
ruby基础(四)的更多相关文章
- 1月10日 ruby基础教程,查漏补缺; 2月22日 Exception补充
https://ruby-doc.org/core-2.5.0/Exception.html 1月20日练习完1,2章. 第一章 初探 ‘’单引号不执行转义符. \t 制表符.\n 换行符. p me ...
- ruby基础(一)
Ruby基础 1.对象.变量和常量 1.1 对象 在Ruby中表示数据的最基本单位是对象,任何数据都是对象,使用类来表示对象的种类. 一个某个类的对象称作对象的实例. 对象 类 eg 数值 Numer ...
- Python全栈开发【基础四】
Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...
- Bootstrap<基础四> 代码
Bootstrap 允许您以两种方式显示代码: 第一种是 <code> 标签.如果您想要内联显示代码,那么您应该使用 <code> 标签. 第二种是 <pre> 标 ...
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
- C#_02.13_基础四_.NET方法
C#_02.13_基础四_.NET方法 一.方法概述: 方法是一块具有名称的代码.可以通过方法进行调用而在别的地方执行,也可以把数据传入方法并接受数据输出. 二.方法的结构: 方法头 AND 方法 ...
- Ruby基础教程
一.Ruby基础知识 1.关于Ruby Ruby是脚本语言 Ruby是面向对象语言 Ruby是跨平台语言 Ruby是开放源码软件 2.Ruby入门书籍推荐 <Ruby.Programming向R ...
- day 68 Django基础四之模板系统
Django基础四之模板系统 本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法 模板渲染的官方文档 关 ...
- day 54 Django基础四之模板系统
Django基础四之模板系统 本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法 模板渲染的官方文档 关于模 ...
随机推荐
- 手机浏览器通过Scheme跳转APP,兼容各种手机浏览器
一个比较完整的产品线,必定有APP和网站,另外还有微信公众号网页和小程序.那么有一个比较常见的需求就是在手机浏览器内打开APP,实现起来也比较简单,只要APP配置的有URLScheme即可. 但是因为 ...
- Elasticsearch 主节点和暖热节点解析
Elasticsearch 主节点和暖热节点解析 主节点 控制整个集群,进行一些轻量级操作,列如:跟踪哪些节点是集群中的一部分,决定节点分片分配,负责集群健康, 不包含数据,也不参与搜索和索引操作,对 ...
- 百度开源中国(Java)面经
一.自我介绍 面试嘛,万年不变还是自我介绍,就说说你是干嘛的(专业是啥),为什么会选择该公司(说一说自己为何向往Java开发),再谈谈自己的优点(兴趣爱好).如果人家叫停了,就别一股脑接着讲了,停下来 ...
- 带你全面认识CMMI V2.0(四)——管理 赋能
风险和机会管理(PSK)包括:识别威胁和机会:评估其发生和影响的可能性:减轻潜在威胁:利用潜在机会目的:识别,记录,分析和管理潜在的风险或机会.价值:减轻不利影响或利用积极影响来增加实现目标的可能性. ...
- Java读取图片exif信息实现图片方向自动纠正
起因 一个对试卷进行OCR识别需求,需要实现一个功能,一个章节下的题目图片需要上下拼接合成一张大图,起初写了一个工具实现图片的合并,程序一直很稳定的运行着,有一反馈合成的图片方向不对,起初怀疑是本身图 ...
- Nginx的进程管理与重载原理
目录 进程结构图 信号量管理 Linux的信号量管理机制 利用信号量管理Nginx进程 配置文件重载原理 进程结构图 Nginx是多进程结构,多进程结构设计是为了保证Nginx的高可用高可靠,包含: ...
- 如何在CSS中映射的鼠标位置,并实现通过鼠标移动控制页面元素效果
映射鼠标位置或实现拖拽效果,我们可以在 JavaScript 中做到这一点.但实际上,在CSS中有更加简洁的方法,我们可以在不使用JavaScript 的情况下,仍然可以实现相同的功能! 只使用CSS ...
- 5. Mybatis UPDATE更新,DELETE删除
案例: 1. update <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper ...
- ReentrantLock理解
原文出处:http://www.yund.tech/zdetail.html?type=1&id=ef94715a2838f06ab03b8621c23d1613 作者:jstarseven ...
- 03- web表单测试
软件分为 b/s c/s两种架构 表单测试 1.用户注册,登录,信息提交. 2.用户查询商品. 3.用户订购商品. 4.用户查询订单等. 表单测试实例 表单数据添加测试(一) 添加按钮可用,测试点击添 ...