今天看了《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. 一篇个人感觉比较好的lua入门的文章

    原文转自www.cppprog.com,由三篇文章组成 Lua是一个嵌入式的脚本语言,它不仅可以单独使用还能与其它语言混合调用.Lua与其它脚本语言相比,其突出优势在于: 1.  可扩展性.Lua的扩 ...

  2. MVC学习日记(三)EntityFramework

    其实学会了第一篇的创建和第二篇的使用以后,基本的mvc操作足够了,至于验证神马的,还不如用Jquery.h5的好看适用,所以接下来, 后续上会讲一些比较实用的. 在之前的文章说到了基础的使用, 那么, ...

  3. 6.Renderer Window

    渲染是实时的,所见即所得.同时还可以输出一些统计信息. Pixel Snoop:获取颜色值,同时把该值复制到剪贴板,主要用户是获取颜色值 Wireframe:开启后可以查看3D节点图形骨架 Stati ...

  4. 利用JavaScript的%做隔行换色

    <html> <head> <meta charset="utf-8"> <title>无标题文档</title> &l ...

  5. 利用JavaScript制作简易日历

    <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <head> <met ...

  6. 模拟试题A

    模拟试题A 一.单项选择题(2′*12=24′) 1.下面各种坐标变换中,会产生变换前后维度的改变的是( ) A)建模变换 B)观察变换 C)投影变换 D)视口变换 2.下列描述深度缓冲消隐算法的特点 ...

  7. 动态给某一个元素添加active

    <li class="one_data" data-id='+ navGroup.self_first_nav[i].id +'><a  href='+ navG ...

  8. java 常用API 包装 练习

    package com.oracel.demo01; import java.util.Random; public class Swzy { public static void main(Stri ...

  9. day27-1 numpy模块

    目录 numpy array 一维数组 二维数组(用的最多) np.array和list的区别 获取多维数组的行和列 多维数组的索引 高级功能 多维数组的元素替换 多维数组的合并 通过函数方法创建多维 ...

  10. node——获取路由中的参数

    var express=require('express'); var app=express(); app.get('/',function(req,res){ res.send('Index'); ...