ruby基础知识

模块

模块是ruby的特色功能之一。如果说类是事物的实体以及行为,那么模块表现的

就是事物的行为部分,模块和类有以下两点不同:

  1. 模块不能拥有实例
  2. 模块不能被继承

模块的使用方法

module Mymodule
#共同的方法
end class Myclass1
include Mymodule
#Myclass1独有的方法
end class Myclass2
include Mymodule
#Myclass2独有的方法
end

使用模块可以灵活的解决下面的问题

  1. 虽然两个类拥有相同的功能,但是不希望他们作为相同的种类来考虑
  2. 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.

包含模块时查找方法的顺序

  1. 原类中方法优先级高于包含模块的
  2. 类中包含多个模块,优先使用最后包含的模块
  3. 多个模块,模块中包含模块,优先使用最后一个模块和模块中包含的模块。
  4. 相同模块第二次包含会被省略。

可以使用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. 1月10日 ruby基础教程,查漏补缺; 2月22日 Exception补充

    https://ruby-doc.org/core-2.5.0/Exception.html 1月20日练习完1,2章. 第一章 初探 ‘’单引号不执行转义符. \t 制表符.\n 换行符. p me ...

  2. ruby基础(一)

    Ruby基础 1.对象.变量和常量 1.1 对象 在Ruby中表示数据的最基本单位是对象,任何数据都是对象,使用类来表示对象的种类. 一个某个类的对象称作对象的实例. 对象 类 eg 数值 Numer ...

  3. Python全栈开发【基础四】

    Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...

  4. Bootstrap<基础四> 代码

    Bootstrap 允许您以两种方式显示代码: 第一种是 <code> 标签.如果您想要内联显示代码,那么您应该使用 <code> 标签. 第二种是 <pre> 标 ...

  5. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  6. C#_02.13_基础四_.NET方法

    C#_02.13_基础四_.NET方法 一.方法概述: 方法是一块具有名称的代码.可以通过方法进行调用而在别的地方执行,也可以把数据传入方法并接受数据输出. 二.方法的结构: 方法头  AND  方法 ...

  7. Ruby基础教程

    一.Ruby基础知识 1.关于Ruby Ruby是脚本语言 Ruby是面向对象语言 Ruby是跨平台语言 Ruby是开放源码软件 2.Ruby入门书籍推荐 <Ruby.Programming向R ...

  8. day 68 Django基础四之模板系统

      Django基础四之模板系统   本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法   模板渲染的官方文档 关 ...

  9. day 54 Django基础四之模板系统

    Django基础四之模板系统   本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法   模板渲染的官方文档 关于模 ...

随机推荐

  1. UnboundLocalError: local variable 'foo' referenced before assignment Python常见错误

    在定义局部变量前在函数中使用局部变量(此时有与局部变量同名的全局变量存在) 在函数中使用局部变来那个而同时又存在同名全局变量时是很复杂的, 使用规则:如果在函数中定义了任何东西,如果它只是在函数中使用 ...

  2. 第4 章 : 理解 Pod 和容器设计模式

    理解Pod和容器设计模式 本文整理自 CNCF 和阿里巴巴联合举办的云原生技术公开课的课时 4:理解 Pod 和容器设计模式.本次课程中,阿阿里巴巴高级技术专家.CNCF 官方大使张磊为大家介绍了为什 ...

  3. 折腾kubernetes各种问题汇总-<1>

    折腾kubernetes各种问题汇总-<1> 折腾部署fluend-elasticsearch日志,折腾出一大堆问题,解决这些问题过程中,感觉又了解了不少. 如何删除不一致状态下的rc,d ...

  4. [BFS]细胞问题

    细胞问题 题目描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.(1<=m,n<=100)? 输入格 ...

  5. redis安装、配置、启动

    一.redis默认安装位置:/usr/local/bin redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何,服务启动起来后执行redis-check-aof:修复 ...

  6. SqlServer存储过程应用二:分页查询数据并动态拼接where条件

    前言 开发中查询功能是贯穿全文的,我们来盘一盘使用存储过程分页查询,并且支持动态拼接where条件. 划重点:支持动态拼接where条件 对存储过程的使用有疑问的同学去[SqlServer存储过程的创 ...

  7. python基础(补充):lambda匿名函数,用了的,都说好!

    lambda函数又叫做"匿名函数".当你完成一件小工作时,直接使用该函数可以让你的工作得心应手. lambda函数介绍 在Python中,定义函数使用的是def关键字,但是通过la ...

  8. 一般实现分布式锁都有哪些方式?使用redis如何设计分布式锁?使用zk来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?

    #(1)redis分布式锁 官方叫做RedLock算法,是redis官方支持的分布式锁算法. 这个分布式锁有3个重要的考量点,互斥(只能有一个客户端获取锁),不能死锁,容错(大部分redis节点创建了 ...

  9. JVM学习笔记(二):JVM基本结构

    1 来源 来源:<Java虚拟机 JVM故障诊断与性能优化>--葛一鸣 章节:第二章 本文是第二章的一些笔记整理. 2 JVM基本参数-Xmx java命令的一般形式如下: java [- ...

  10. springboot 配置将info、error、debug 分别输出到不同文件

    在resource下创建名为 logback-spring.xml 的配置文件,内容如下: <?xml version="1.0" encoding="UTF-8& ...