今天看了《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)的更多相关文章

  1. Javascript学习6 - 类、对象、继承

    原文:Javascript学习6 - 类.对象.继承 Javasciprt并不像C++一样支持真正的类,也不是用class关键字来定义类.Javascript定义类也是使用function关键字来完成 ...

  2. 《python基础教程(第二版)》学习笔记 类和对象(第7章)

    <python基础教程(第二版)>学习笔记 类和对象(第7章) 定义类class Person:    def setName(self,name):        self.name=n ...

  3. OC学习5——类和对象

    1.OC是在C语言基础上进行扩展得到的一门面向对象的程序设计语言,它也提供了定义类.成员变量和方法的基本功能.类可以被认为是一种自定义的数据类型,使用它可以定义变量,所有使用类定义的变量都是指针类型的 ...

  4. [Java初探08]__简单学习Java类和对象

    前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...

  5. Java学习笔记--类和对象

    1.介绍面向对象的编程          面向对象是现在主流的编程样例,它替代了以前C语言使用时的“结构体”,Java是一门面向对象的语言,所以需要熟悉面向对象的概念.面向对象的程序由很多对象组成,每 ...

  6. scala学习笔记——类和对象

    基础语法关于Scala程序,这是非常要注意以下几点. 区分大小写 - Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义. 类名 - 对于所有的类名的第一个字 ...

  7. 学习:类和对象——对象模型和this指针

    成员变量和成员函数分开存储: 在C++中,类内的成员变量和成员函数分开存储 第一点:空对象占用内存空间1个字节 第二点:只有非静态成员变量才属于类的对象上,非静态成员函数和静态成员函数和静态成员变量不 ...

  8. Python学习笔记——类和对象

    类和对象 1. 一个例子 # 对象 = 属性 + 方法 # Python 中的类名称约定首字母大写,而 Python 函数名首字母小写 class Turtle: #属性 color = 'green ...

  9. 【Java学习】类、对象、实例—类是对象的抽象,对象是类的实例

    类.对象.实例的关系是什么,如果不能很好的理解什么是类什么是对象就无法讲清楚, 类:某种事物与另一种事物具有相似性,比如哈士奇和泰迪,我们发现他们有一些相似的特性和行为,在生物学上,他们都属于“狗”, ...

  10. Ruby学习: 类的定义和实例变量

    ruby是完全面向对象的,所有的数据都是对象,没有独立在类外的方法,所有的方法都在类中定义的. 一.类的定义语法 类的定义以 class 关键字开头,后面跟类名,以 end标识符结尾. 类中的方法以 ...

随机推荐

  1. python 数据的基本类型(字符串)

    python 基础 ascii:字母,数字,特殊字符:1个字节(byte) 8个字位(bit)unicode: 16位两个字节,升级32个字节 4个字位utf-8:最少一个字节 8个表示. 英文 8字 ...

  2. jupyter在特定环境特定目录中启动

    代码如下: @echo off start %windir%\System32\cmd.exe "/c" D:\Anaconda\Scripts\activate.bat # 启动 ...

  3. Queue 与List、LinkedList与 ArrayList 区别

    List 是一个接口,不能实例化,通过实例化ArrayList 或者LinkedList来调用:List list = new ArrayList(); |--List: 元素是有序的(怎么存的就怎么 ...

  4. POJ 1386 判断欧拉回路

    题意:要开启一扇门,n个单词是密码,n个单词中,如果一个单词的首字母和前一个单词的尾字母相同,并且每个单词都能这么连起来且只用一次,则门可以开启,否则不能开启,现给出单词,判断门是否可以开. 有向图欧 ...

  5. 洛谷P2851 [USACO06DEC]最少的硬币The Fewest Coins(完全背包+多重背包)

    题目描述 Farmer John has gone to town to buy some farm supplies. Being a very efficient man, he always p ...

  6. Poj Maya Calendar

    http://poj.org/problem?id=1008 Maya Calendar Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...

  7. DBGridEh checkbox的一个问题

    function TCustomDBGridEh.CheckBeginRowMoving(MouseX, MouseY: Integer; CheckInOnly: Boolean): Boolean ...

  8. 三大Flex布局用法(转载)

    Flex布局基础 对于Flex 初学者,在Hello World之后,Flex布局便是下一站学习要的要义.若是从传统的Html转变而来,总希望找到类似于Div/Table/UL等之类的控件,也希望在 ...

  9. python学习小结

    1学习的课程名字叫什么 python:前端初识html,后台基础flask 2怎么输出一句话,用代码举例 输出用:print 例如: 3使用终端工具怎么运行 Python代码 例如我要运行题目2的程序 ...

  10. RHEL 7 & CentOS 7禁用IPV6(转载)

    RHEL 7 & CentOS 7下禁用IPV6的方法和之前的版本不太一样了,本文整理了一下处理方法: 首先,我们必须给出最根本的解决方法:修改grub,在引导时就不加载IPV6模块 这样修改 ...