Ruby学习(三)——类与对象(1)
今天看了《Ruby元编程》,感觉内容新颖翔实,是Ruby中难得的一见的好书,在此推荐给大家。其实今天看的主要是第一章的第一部分,先把内容梳理一下,也许这一部分会分成几天的内容来给大家介绍吧。
首先来说明一下,作为一种面向对象语言,Ruby中自然包含两个感念,即“类”与“对象”。一般而言,类是一组方法和一组数据的集合,而对象则可以看作是类的实例化。需要注意的是,在Ruby中“对象是由实例变量和一个类的引用组成”(《Ruby元编程》),这句话是什么意思呢?让我们先来看一个书中的示例,了解一下什么是实例变量,以及它具有的特性
class MyClass
def my_method
@v = 1
end
end
obj = MyClass.new
obj.instance_variables
obj.my_method
obj.instance_variables
此时,系统给出的输出是
=> []
=> [:@v]
从中可见,对象obj的实例变量就是@v,但是相信大家也注意到了,当obj未执行my_method时,obj对象不具备任何实例变量,也即是说,对象obj的实例变量与类MyClass没有任何关联,它只是在执行过程中生成的。而这正是Ruby与其他静态语言的差别之一。
前文提到了,类是由数据和方法组成的,而对象作为类的实例化,也自然具备方法。探讨了数据之后,我们再来看看Ruby对象的方法。事实上,在Ruby的对象中并没有存储方法,而是将方法存储到了类中,因此对象必须存储其自身的类,在此例中极为MyClass,我们可以通过相关代码来查看:
obj.class # => MyClass
如果你了解C#或Java,也许你会说,my_method难道是类的静态方法?其实这是一种错误的理解,正确的说法是:my_method是类的实例方法(即必须通过定义类的实例才能使用),是对象obj的方法。而我们头脑中的“静态方法”在Ruby中被称为“类的方法”,是不是这些概念有点绕?没关系,我们再看一个例子(也是《Ruby元编程》中的):
String.instance_methods = "abc".methods
上面这个示例的返回结果是true,而
String.methods = "abc".methods
的返回结果则是false
是不是清楚了一些呢?
【注】另外再说一句,在所有类外定义的函数是全局函数,而这些所谓的全局函数其实是Object类的私有实例方法。
关于这一点,我们不妨做一个小的实验
首先定义一个函数
def test_method
puts "test Object methods"
end
此时,在irb中执行以下命令:
Object.private_methods
可以看到,test_method已经成为Object的私有函数了。
Ruby学习(三)——类与对象(1)的更多相关文章
- Javascript学习6 - 类、对象、继承
原文:Javascript学习6 - 类.对象.继承 Javasciprt并不像C++一样支持真正的类,也不是用class关键字来定义类.Javascript定义类也是使用function关键字来完成 ...
- 《python基础教程(第二版)》学习笔记 类和对象(第7章)
<python基础教程(第二版)>学习笔记 类和对象(第7章) 定义类class Person: def setName(self,name): self.name=n ...
- OC学习5——类和对象
1.OC是在C语言基础上进行扩展得到的一门面向对象的程序设计语言,它也提供了定义类.成员变量和方法的基本功能.类可以被认为是一种自定义的数据类型,使用它可以定义变量,所有使用类定义的变量都是指针类型的 ...
- [Java初探08]__简单学习Java类和对象
前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...
- Java学习笔记--类和对象
1.介绍面向对象的编程 面向对象是现在主流的编程样例,它替代了以前C语言使用时的“结构体”,Java是一门面向对象的语言,所以需要熟悉面向对象的概念.面向对象的程序由很多对象组成,每 ...
- scala学习笔记——类和对象
基础语法关于Scala程序,这是非常要注意以下几点. 区分大小写 - Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义. 类名 - 对于所有的类名的第一个字 ...
- 学习:类和对象——对象模型和this指针
成员变量和成员函数分开存储: 在C++中,类内的成员变量和成员函数分开存储 第一点:空对象占用内存空间1个字节 第二点:只有非静态成员变量才属于类的对象上,非静态成员函数和静态成员函数和静态成员变量不 ...
- Python学习笔记——类和对象
类和对象 1. 一个例子 # 对象 = 属性 + 方法 # Python 中的类名称约定首字母大写,而 Python 函数名首字母小写 class Turtle: #属性 color = 'green ...
- 【Java学习】类、对象、实例—类是对象的抽象,对象是类的实例
类.对象.实例的关系是什么,如果不能很好的理解什么是类什么是对象就无法讲清楚, 类:某种事物与另一种事物具有相似性,比如哈士奇和泰迪,我们发现他们有一些相似的特性和行为,在生物学上,他们都属于“狗”, ...
- Ruby学习: 类的定义和实例变量
ruby是完全面向对象的,所有的数据都是对象,没有独立在类外的方法,所有的方法都在类中定义的. 一.类的定义语法 类的定义以 class 关键字开头,后面跟类名,以 end标识符结尾. 类中的方法以 ...
随机推荐
- FastDFS介绍(非原创)
文章大纲 一.FastDFS介绍二.FastDFS安装与启动(Linux系统)三.Java客户端上传图片四.参考文章 一.FastDFS介绍 1. 什么是FastDFS FastDFS是用C语言编 ...
- BZOJ 4262 线段树+期望
思路: 把询问离线下来,查询max和查询min相似,现在只考虑查询max 令sum[l,r,x]表示l到r内的数为左端点,x为右端点的区间询问的答案 那么询问就是sun[l1,r1,r2]-sum[l ...
- 树莓派-基于aria2实现离线下载
安装aria2 aria2是linux下的一个下载工具,它支持http.bt种子.磁力链接三种方式下载 sudo apt-get install aria2 配置aria2 aria2支持命令参数,也 ...
- Python 之 风格规范(Google )
开头先mark一下网址:goole官网 任何语言的程序员,编写出符合规范的代码,是开始程序生涯的第一步. 一.分号 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 二.行长度 每行不超过80个 ...
- MySQL 5.6 Reference Manual-14.4 InnoDB Configuration
14.4 InnoDB Configuration 14.4.1 InnoDB Initialization and Startup Configuration 14.4.2 Configuring ...
- RAP开发入门-布局管理
布局类继承关系 FillLayout new FillLayout(SWT.VERTICAL/HORIZONTAL)设置竖直/水平填充 RowLayout wrap折行显示.pack自适应布局(布局 ...
- (转) RabbitMQ学习之spring整合发送同步消息(注解实现)
http://blog.csdn.net/zhu_tianwei/article/details/40918477 上一篇文章通过xml配置rabbitmq的rabbitTemplate,本节将使用注 ...
- setTimeout()传带有参数的函数
w3cshool里的解释:setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,语法:setTimeout(code,millisec). 也就是说,第一个参数可以是字符串形式的Ja ...
- 【数据分析学习】Pandas学习记录
import pandas as pd path = r'F:\数据分析专用\数据分析与机器学习\food_info.csv' with open(path, 'r') as f: data = pd ...
- mysql8下载与安装
MySQL各版本的区别 MySQL 8.0.13安装教程(windows 64位) 编码用utf8mb4 Navicat连接mysql出现1862错误