类和模块

1.类

类是面向对象中一个重要的术语。我们可以把类看作是对象的抽象,

所有的这类对象都有这些特征。而对象则是类的具体实现,按照类的要求创建的

对象就是该类的对象。类就像对象的雏形一样,决定了对象的行为。

eg:用数组类创建数组对象

arr=Array.new   #[]

用class方法查看对象属于那个类

arr=[1,2,3]
p arr.class #Array
p Array.class #Class

所有的类都是Class类的对象。

当判断某个对象是否属于某个类,我们可以使用instance_of?方法。

arr=[1,2,3]
p arr.instance_of? Array #true
p arr.instance_of? Object #false

继承

通过扩展已经创建的类来创建新的类成为继承。继承后创建的新类被称为子类。

被继承的类称为父类。

BasicObject类是ruby中所有类的父类。他定义了作为ruby对象最基本的功能。

Object是BasicObject的子类。定义一般类所需要的功能。

根据类的反向继承关系追查对象是否属于某个类,则可以使用is_a?方法。

arr=[1,2,3]
p arr.is_a? Array #true
p arr.is_a? Object #true

创建类

class 类名
类的定义
end

类名的首字母必须大写.eg:

class Sayhello
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end def hello
puts "hello,I am #{@name}!"
end
end #实例化对象
java=Sayhello.new("java")
ruby=Sayhello.new

调用new方法创建对象时会默认调用initialize方法。

@name时实例变量。hello方法时实例方法。实例方法中可以直接引用实例变量。

引用未定义的实例变量会返回nil.

存取器

ruby中不能直接访问实例变量或对实例变量赋值。需要通过方法来操作。
class Sayhello
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end def hello
puts "hello,I am #{@name}!"
end
#获取实例变量的方法
def name
puts "获取实例变量@name"
@name
end
#修改实例变量的方法
def name=(value)
puts "修改实例变量@name"
@name=value
end
end #实例化对象
java=Sayhello.new("java") #调用initialize方法
p java.name #调用name方法
java.name="python" #调用name=方法
p java.name #调用name方法
java.hello #调用hello方法

Ruby提供了更简便的实现方法

定义 意义
attr_reader :name 只读(定义name方法)
attr_writer :name 只写(定义name=方法)
attr_accessor :name 读写(定义上面的两个方法)

eg:

class Sayhello
#name和name=
attr_accessor :name
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end def hello
puts "hello,I am #{@name}!"
end
end #实例化对象
java=Sayhello.new("java") #调用initialize方法
p java.name #"java"
java.name="python"
p java.name #"python"
java.hello #hell0,I am python

特殊变量self

在类内部self指向类自身,在实例方法内部,self指向调用方法的实例。

class Sayhello
#name和name=
attr_accessor :name
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end def hello
puts "hello,I am #{self.name}!"
end
end #实例化对象
java=Sayhello.new("java") #调用initialize方法 java.hello #hell0,I am java

等价于

class Sayhello
#name和name=
attr_accessor :name
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end def hello
puts "hello,I am #{@name}!"
end
end #实例化对象
java=Sayhello.new("java") #调用initialize方法 java.hello #hell0,I am java

类方法

class Sayhello
class << Sayhello
def hello(name)
puts "#{name} said hello."
end
end def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end def hello
puts "hello,I am #{@name}!"
end
end #实例化对象
java=Sayhello.new("java") #调用initialize方法
java.hello #hell0,I am java
#调用类方法
Sayhello.hello "ruby" #ruby said hello;

在类内部定义类方法

class Sayhello
class << self
def hello(name)
puts "#{name} said hello"
end
end
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end def hello
puts "hello,I am #{@name}!"
end
end #调用类方法
Sayhello.hello "ruby" #ruby said hello

或者

class Sayhello
def Sayhello.hello(name)
puts "#{name} said hello"
end
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end def hello
puts "hello,I am #{@name}!"
end
end #调用类方法
Sayhello.hello "ruby" #ruby said hello

或者

class Sayhello
def self.hello(name)
puts "#{name} said hello"
end
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end def hello
puts "hello,I am #{@name}!"
end
end #调用类方法
Sayhello.hello "ruby" #ruby said hello

使用class <<类名 ~ end 这种写法的类定义称为单例类定义。

单例类定义中定义的方法称为单例类方法。

常量

class语句中可以定义常量

class Sayhello
Version="1.0"
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end def hello
puts "hello,I am #{@name}!"
end
end #实例化对象
p Sayhello::Version #"1.0"

类变量

类变量为所有类的实例所共享,从类的外部访问类变量时需要存储器,不能使用

attr_accessor等,需要直接定义。

class Sayhello
@@count=0
def Sayhello.count
@@count
end
def initialize(myname="ruby")
puts "调用我实例化对象"
@name=myname
end def hello
@@count+=1
puts "hello,I am #{@name}!"
end end #实例化对象
p Sayhello.count #0
ruby=Sayhello.new
ruby.hello
java=Sayhello.new "java"
java.hello
p Sayhello.count #2

限制方法的调用

Ruby提供了三种方法的访问级别:

关键字 访问级别
public 以实例方法的形式向外公开该方法
private 只在类内部可以用
protected 类内部及子类中可以使用

eg:

class AccTest
def pub
puts "hello"
end
#设置方法的访问权限
public :pub
def priv
puts "private"
end
#设置方法的访问权限
private :priv
end acc=AccTest.new
acc.pub
acc.priv #NoMethodError

希望统一定义多个方法的访问级别时。可以使用下面的语法。

eg:

class AccTest
public #以下的方法都被定义为public
def pub
puts "hello"
end
private #以下方法都被定义为private
def priv
puts "private"
end
end acc=AccTest.new
acc.pub
acc.priv #NoMethodError

没有定义访问访问级别方法默认为public,但是initialize方法是个例外,

他通常被定义为private.

扩展类

eg:在原有的类的基础上添加方法

class String
def count_word
#用空格分割self
ary=self.split(/\s+/)
#返回分解后的数组的长度
return ary.size
end
end
str="I am ruby"
p str.count_word #3

继承

class 类名 < 父类名
类定义
end

eg:RingArray继承Array

class RingArray < Array
#重定义运算符[]
def[](i)
ind=i%self.size
super(ind)
end
end arr=RingArray["金","木","水","火","土"]
p arr[6] #"木"
p arr[12] #"水"

定义类的时候没有指定父类的情况下,ruby会默认该类为Object类的子类。

有时候我们希望继承更轻量级的类,就会使用BasicObject类

eg:查看类的实例方法

p Object.instance_methods
p BasicObject.instance_methods
#[:!, :==, :!=, :__send__, :equal?, :instance_eval, :instance_exec, :__id__]

需要继承BasicObject类,需要显式的继承。

alias与undef

使用alias给方法设置别名.或者在重定义已经存在的方法时,为了使用别名调用

原来的方法,也需要用到alias.

alias 别名  原名
alias :别名 :原名
class Sayhello
def hello
"hello"
end
alias sayhello hello
end h=Sayhello.new
p h.sayhello #"hello"

eg:

class Sayhello
def hello
"hello"
end
alias sayhello hello
end class Child < Sayhello
alias old_hello hello
def hello
"#{old_hello},again."
end
end child=Child.new
p child.old_hello #"hello"
p child.hello #"hello,again."

undef

undef用于删除已定义的方法。

undef 方法名
undef :方法名

eg:子类中删除父类定义的方法

class Sayhello
def hello
"hello"
end
alias sayhello hello
def del
"delete"
end
end class Child < Sayhello
alias old_hello hello
def hello
"#{old_hello},again."
end
undef del
end child=Child.new
p child.old_hello #"hello"
p child.hello #"hello,again."
p child.del #NoMethodError

单例类

利用单例类给对象添加方法

str1="Ruby"
str2="Ruby"
class << str1
def hello
"hello,#{self}!"
end
end p str1.hello #"hello,Ruby!"
p str2.hello #(NoMethodError)

Ruby中所有的类都是Class类的对象,因此,Class对象的实例方法以及

类对象的单例方法都是类方法。

ruby基础(三)的更多相关文章

  1. Ruby语法基础(三)

    Ruby语法基础(三) ​ 在前面快速入之后,这次加深对基本概念的理解. 字符串 ​ Ruby字符串可以分为单引号字符串和双引号字符串,单引号字符串效率更高,但双引号的支持转义和运行 puts '单引 ...

  2. 1月10日 ruby基础教程,查漏补缺; 2月22日 Exception补充

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

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

    Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...

  4. Bootstrap <基础三十二>模态框(Modal)插件

    模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用  ...

  5. Bootstrap <基础三十一>插件概览

    在前面布局组件中所讨论到的组件仅仅是个开始.Bootstrap 自带 12 种 jQuery 插件,扩展了功能,可以给站点添加更多的互动.即使不是一名高级的 JavaScript 开发人员,也可以着手 ...

  6. Bootstrap <基础三十>Well

    Well 是一种会引起内容凹陷显示或插图效果的容器 <div>.为了创建 Well,只需要简单地把内容放在带有 class .well 的 <div> 中即可.下面的实例演示了 ...

  7. Bootstrap<基础三> 排版

    Bootstrap 使用 Helvetica Neue. Helvetica. Arial 和 sans-serif 作为其默认的字体栈. 使用 Bootstrap 的排版特性,您可以创建标题.段落. ...

  8. jdbc基础 (三) 大文本、二进制数据处理

    LOB (Large Objects)   分为:CLOB和BLOB,即大文本和大二进制数据 CLOB:用于存储大文本 BLOB:用于存储二进制数据,例如图像.声音.二进制文件 在mysql中,只有B ...

  9. C#_02.13_基础三_.NET类基础

    C#_02.13_基础三_.NET类基础 一.类概述: 类是一个能存储数据和功能并执行代码的数据结构,包含数据成员和函数成员.(有什么和能够干什么) 运行中的程序是一组相互作用的对象的集合. 二.为类 ...

  10. Ruby基础教程

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

随机推荐

  1. 认识Python解释器和PyCharm编辑器

    (1)安装Python解释器 Python官网:https://www.python.org/ 下载对应机器(Windows/Mac)的安装包: 百度网盘地址: 链接:https://pan.baid ...

  2. flexbox(弹性盒布局模型),以及适用场景

    一.是什么 Flexible Box 简称 flex,意为"弹性布局",可以简便.完整.响应式地实现各种页面布局 采用Flex布局的元素,称为flex容器container 它的所 ...

  3. Dynamics CRM实体系列之窗体

    本节开始讲Dynamics CRM的窗体排版和设计,窗体也就是我们实际可以看到的表单界面.Dynamics CRM提供了一套独立的表单模板设计引擎,可以很方便的为开发者提供无代码开发,只需要简单的拖动 ...

  4. BUAA_2020_OO_UNIT4_REVIEW&ALL_REVIEW

    OO第四单元总结&&学期总结 1. 第四单元作业总结 本单元三次作业都围绕了UML图的建模展开,第十三次作业只有类图,第十四次作业增加了顺序图和状态图,第十五次增加了部分UML规则的判 ...

  5. C语言利用for循环打印菱形

    C语言利用for循环打印菱形(高度为奇数) 这次用的方法是上下部分分开打印,先打印上部分,再打印下部分. 先举个简单的例子打印,再改进代码,登堂入室从而理解. 例:打印一个高度(高度必须为奇数)为 5 ...

  6. 在Visual Studio 中使用git——给Visual Studio安装 git插件(二)

    在Visual Studio 中使用git--什么是Git(一) 第二部分: 给Visual Studio安装 git插件 如果要使用 git 进行版本管理,其实使用 git 命令行工具就完全足够了, ...

  7. jasypt-spring-boot提示Failed to bind properties

    1 问题描述 在Spring Boot中使用jasypt-spring-boot进行加密,但是提示: Description: Failed to bind properties under 'spr ...

  8. RPC理论介绍

    目录 RPC概述 RPC是什么 和本地调用有什么区别 RPC模式 RPC的三个过程 为什么要使用RPC RPC和其他协议的区别 RPC使用场景 RPC的流程 RPC核心概念术语 RPC协议 RPC框架 ...

  9. 【Azure Redis 缓存 Azure Cache For Redis】Redis连接池

    问题描述 Redis根据定价层说明,不同级别支持的连接数最多可达4万(同时),但是当短时间又大量连接请求建立的时候,Redis服务的服务压力非常大,到达100%.严重影响了高响应的要求.最严重时,经常 ...

  10. OAuth 2.0 了解了,OAuth 2.1 呢?

    OAuth 2.0 OAuth 2.0 是工业级标准授权协议. OAuth 2.0 聚焦于客户端开发者便利性,为网页应用程序.桌面客户端.手机.客厅设备提供特定的授权流程. RFC6749 OAuth ...