Ruby元编程笔记——1.对象模型

打开类

在Ruby中,定义类的语句和其他语句没有本质区别,你可以在类定义中放置任何语句。

class C
  puts "Hello"
end
=> Hello

Ruby的class关键字更像是一个作用域操作符而不是类型声明语句。你总是可以重新打开已经存在的类并对它进行动态修改。

class D
  def x
    puts 'x'
  end
end

class D
  def y
    puts 'y'
  end
end

obj = D.new
obj.x            # => x
obj.y            # => y

类的真相

对象中有什么

实例变量

instance_variables

方法

methods

类自身也是对象


常量

任何以大写字母开头的引用(包括类名和模块名),都是常量。

方法查找

向右一步,再向上


image.png

当你在一个类中包含一个模块时,Ruby创建了一个封装该模块的匿名类,并把这个匿名类插入到祖先链中,其在链中的位置正好包含在她的类上方。


包含模块的方法查找

执行方法

每一行代码都会在一个对象中被执行——这个对象就是所谓的当前对象。当前对象也可以用self表示。
当开始运行Ruby程序时,Ruby解释器会创建一个名为main的对象作为当前对象,这个对象有时被称为顶级上下文(top level context)。
在类和模块定义中(并且在任何方法定义之外),self的角色由这个类或模块担任:

class MyClass
  self           # => MyClass
end

小结

  • 对象由一组实例变量和一个类的引用组成。
  • 对象的方法存在于对象所属的类中(从类的角度看,它们叫做实例方法)。
  • 类本身是Class类的对象。类的名字只不过是一个常量而已。
  • Class类是Module的子类。一个模块基本上是由一组方法组成的包。类除了具有模块的特性之外,还可以被实例化(通过new()方法)及被组织为层次结构(通过它的superclass()方法)。
  • 常量像文件系统一样,是按照树形结构组织的。其中模块和类的名字扮演目录的角色,其他普通的常量则扮演文件的角色。
  • 每个类都有一个祖先链,这个链从自己所属的类开始,向上直到BasicObject类结束。
  • 每调用一个方法时,Ruby首先向右一步来到接收者所属的类,然后一直向上查找祖先链,直到找到该方法,或者到达链的顶端为止。
  • 每当类包含一个模块时,该模块会被插入到祖先链中,位置在该类的正上方。
  • 当调用一个方法时,接收者会扮演self的角色。
  • 当定义一个模块(或者类)时,该模块扮演self的角色。
  • 实例变量永远都被认定为self的实例变量。
  • 任何没有明确指定接收者的方法调用 ,都当成是调用self的方法。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近复习了下 ruby 对象模型的知识,参照了 Ruby Metaprogramming,于是边看边做笔记,还是收...
    张羽辰阅读 541评论 0 4
  • 作为一个Ruby开发者,让人又爱又恨的便是元编程了。 【前言】元编程是什么 简单地说,元编程就是对语言本身的进行操...
    未必治撕大叔阅读 707评论 1 6
  • 对象模型 所有class定义之外的代码默认运行在顶级对象main中。 打开类 ruby的class更像是一个作用于...
    五月的约修亚阅读 3,500评论 0 4
  • 第一章节的内容是对象模型,相对来说比较简单,本篇文章先直接总结知识点,其实以后再回过头来看本篇文章的时候直接看知识...
    Jayzen阅读 388评论 0 0
  • 薄凉是个没有过去的人。 老鸨说当年拾到她之前,江南反常的连下了一个星期的鹅毛大雪。说也奇怪,自她出现后,那雪就蓦地...
    醉生梦二阅读 395评论 1 6