Ruby对象与类系列之二

Standard

上面说到Ruby中类和对象的交互就是:对象引用类,类引用零个或多个超类。那我们可以用图形化的方式来说明这个问题:比如有一个吉他类,它定义的方法中有一个play方法。
klass.gif

class Guitar
    def play()
       ……
    end
end

lucille = Guitar.new

图1为变量lucille所引用的Guitar对象,图2为对象lucille的类Guitar,图3为类Guitar的父类Object。从图中可以发现:类Guitar的对象lucille通过klass引用类对象Guitar(Guitar是一个类,同时它又是类Class的一个对象),而类Guitar又通过super来引用它的父类。此处为类Object。

如果调用方法lucille.play()时,Ruby首先找到对象lucille,通过对象lucille的klass引用找到Guitar类对象,然后查找方法列表,找到后执行方法play。

如果调用方法lucille.display()时,Ruby执行上面的步骤,但是在类Guitar的方法列表里并没有发现display方法,此时,它会查找通过super所引用到的Guitar的父类Object的方法列表,找到后执行方法display。

如果调用方法lucille.done(),Ruby执行上述所有操作仍没有发现done方法,此时它会调用method_missing方法,即lucille.method_missing方法来扔出异常。

到此为止,调用对象的实例方法的过程已经很清晰了,但是如果我有一个类方法,比如

Class Guitar
    def Guitar.strings()
        'zhyfng'
    end
end

那么类方法Guitar.strings()又是如何工作的呢?

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s