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的私有函数了。

posted on 2014-04-18 07:23  韧心  阅读(342)  评论(0编辑  收藏  举报

导航