Ruby 中的对象和类模型
来源:互联网 发布:桀骜男士香水知乎 编辑:程序博客网 时间:2024/05/16 11:06
ruby的对象和类模型到底是什么鬼?
在ruby的世界中,有这么三个原则:
所有东西都是对象,除了method和block(经过@chiangdi提醒,并不是Ruby中的任何概念都是对象呢,method和block就不是。 )
所有对象都有一个类
类最终都继承自源类Object,而Object继承自BasicObject
在这个描述中,假设定义了一个类Dog,实例化一个对象tidy,对象tidy的类是Dog,Dog类的类是Class,
Class继承自Module,Module继承自Object,Object最终继承自源类BasicObject,BasicObject也是对象,那BasicObject的继承自谁?
在这里我打开irb,ruby的版本为2.1.2,进行操作。
class Dog ; endtidy = Dog.newtidy.class #=> DogDog.class #=> ClassClass.superclass #=> ModuleModule.superclass #=> ObjectObject.superclass #=> BasicObjectBasicObject.superclass #=> nil
很明显,BasicObject没有超类,这条贪食蛇吃到这里就终止了。
而Dog继承关系上的类概念:Dog,Class,Module,Object,BasicObject的类都是Class。
也就是说我可以创建这些类概念的实例对象,Dog就是一只狗,Class就是一个类,Module就是一个模块,
Object就是一个对象,BasicObject就是一个基础对象。而Dog,Module和Class自己本身都是Class类的一个
实例对象,可以去创建我们想要用的概念对象。
而Object和BasicObject包括一些对象的基本方法,例如Object的nil?方法,
因为所有对象都会继承自Object,所以所有对象都会有nil
方法;又例如BasicObject的instance_eval
方法,因为所有对象
也会继承自BasicObject,所有所有对象也会有instance_eval
方法。
这些方法都可以在ruby的手册上看到。
这里我画了一个继承的图出来。
那BasicObject和Object有没有nil?
和instance_eval
方法呢?
当然会有,因为他是Class的实例对象,对象都继承Object和BasicObject,
他们都可以享有自己的方法。
而我们在讨论对象和类模型的时候一般都会忽略掉BasicObject,因为他置于最顶层,我们不会轻易改变他们,
而只讨论Object以下的对象和类。
eigenclass
eigenclass也叫元类或者单件类。eigen的意思为本质的,换我们中国人古代的概念应该叫元神。
每个对象都有自己的eigenclass,但是却很难找到他。下面代码找出了一只泰迪狗和Dog类的元类。
def Dog ; endtidy = Dog.newtidy_eigenclass = class << tidy selfend tidy_eigenclass => #<Class:#<Dog:0x000000023bc5e8>>tidy_eigenclass.class #=> Classtidy_eigenclass.superclass #=> DogDog_eigenclass = class << Dog selfendDog_eigenclass=> #<Class:Dog>a = Dog_eigenclass.class=> ClassDog_eigenclass.superclass=> #<Class:Object>Dog_eigenclass == a #=> true
上面的代码的意思是:在泰迪狗和Dog类的之前还有一个eigenclass,Dog类与Class类之前还有一个eigenclass。
经@lolychee同学提醒,其实可以通过class << XXX
和XXX.singleton_class
两种方法来找到对象的元类:
Dog_eigenclass = class << Dog selfendDog_eigenclass=> #<Class:Dog>Dog.singleton_class=> #<Class:Dog>
那元类有什么作用呢?
其实有了元类,当我们想要扩展对象和类自身的方法而非继承方法的时候,就变得非常容易,而且可以使用很多种方法来实现。
class Dog def self.bar "wowowo" endend
class Dog class << self def bar "wowowo" end endend
def Dog.bar "wowowo"end
class << Dog def bar "wowowo" endend
上面的定义代码使得Dog类都可以用Dog.bar
来输出"wowowo"。
对类来说,可以使用class_eval
来打开自己来操作类自己。
对对象和类来说,可以使用instance_eval
来打开自己的eigenclass来操作自己。
其实自己再画一个继承图就很好理解了。
其实还有一个nil我还没有画,而nil的class是NilClass。当定义一个Dog,和实例一个对象tidy就成这样的图了。
这个只是局部的显示出eigenclass视图。有人做出了一个不包含eigenclass的ruby常用类的关系图,真心跪了。
总结
想要精通ruby,完全熟悉ruby的对象和类模型是不可缺失的一步。
- Ruby 中的对象和类模型
- Ruby 中的类和对象
- Ruby 中的类和对象
- Ruby和JavaScript对象模型的比较
- Ruby类和对象
- Ruby类和对象
- Ruby类和对象
- Ruby-类和对象
- ruby 类和对象
- Ruby的对象模型
- Ruby对象模型 -整理
- Ruby on Rails中的ORM(对象关系模型)一。
- Ruby中的类模型学习笔记
- Ruby 101:类和对象
- javaScript中的模型对象和Function对象
- Ruby中的类与对象(一)
- Ruby中的面向对象
- ruby中类和对象的结构图
- OC里面小问题集合之一
- C++的新特性
- 为自己的Github主页创建专有域名
- c语言基础之小程序
- github上边一个比较全的库!(留存)
- Ruby 中的对象和类模型
- BigData 大数据时代 生活,工作与思维的大变革(1)
- 不仅仅是软考啊!
- jquery 获得keycode
- viewpager的无限循环方法
- lightOJ 1234 Harmonic Number
- ios
- Gradle用户指南之初学者教程(一)
- Happy