Ruby对象模型 -整理
来源:互联网 发布:初学数控车床编程教程 编辑:程序博客网 时间:2024/06/05 22:34
首先,需要先搞清楚Class, Module, Object,Kernel的关系
【转】
- Module是Class的父类.
- Class, Module, Object 都是class,而Kernel是Module。
- Object是Ruby中所有类的父类,Object混入了Kernel这个模块,所以Kernel中内建的核心函数就可以被Ruby中所有的类和对象访问。
- Object的实例方法由Kernel模块定义。
Kernel理解为系统预定义的一些方法,我们可以在所有的对象上使用,使用时不需要使用类型作为前缀。
Kernel模块中定义了private method和public method,我们可以在irb里输入Kernel.methods, Kernel.public_methods, Kernel.private_methods.
对于一个普通的对象,可以直接调用Kernel的public method
而要想调用一个普通对象所包含的Kernel的函数,用一般的调用方法无法做到,只有通过Send来实现.
Ruby中的对象
············Ruby中到处都是对象,每一个对象都来自于某一个类,同时这个类可能继承于某一个父类。对象又可以称为类的实例,对象的属性,也就是类的实例变量,存放在对象中,而对象的方法,也就是类的实例方法,存放在类中。所以同一个类下的不同实例可以共享方法,但是实例变量确是不共享的。每一个类都继承与Object类,Object类中存放诸如class()(查看对象的类)等方法,而Object又是继承自BasicObject类(白板类,创建继承自白板类的对象可以消除之前可能存在的所有方法)。每一个对象的类都是Class,Class只是一个封装了new()等方法的Module……
··············示意图(实线表示class,虚线表示超类):
Ruby中的方法
·········· 当你调用一个对象的方法时,系统会从该对象的类中查找是否有该方法,如果没有找到,则会依次到上一级父类中查找,直到找到该方法,如果没有找到,则会调用method_missing()方法,调用幽灵方法,或者报出调用错误的信息。可以调用ancestors方法,查看当前对象的祖先链(即上述查找过程的链结构,特别的,在Object之后,会查找Kernel模块,这是由于Object包含了Kernel模块,Kernel中包含print等方法),Ruby就是在祖先链上依次查找方法。
············找到方法后,自然要执行了,然而按照以上所说,方法的查找需要经过一个祖先链,那么在调用这个方法的时候又是如何确定接受者的呢?在Ruby中,每一行代码都会在当前对象中执行,这个当前对象就是self,没有明确指定接受者的方法都在self上调用。
···········事实上,每个Ruby脚本执行时,都会创建一个main对象作为当前对象,此时,self就是main(main又可以称作顶级上下文,正如python中的顶格书写的代码,而不是c,c++中入口函数的概念)。
·············Ruby中的私有方法也和c++中有所不同。private关键字后面的方法只能被隐含接受者调用,(又由于调用方法时,如果接收者不是自己,则必须明确指定一个接收者,上述下划线文字)所以私有方法只能被自身调用。检查私有方法调用是否合法,只需检查是否指定了接收者(否)以及当前的self是谁。
·············扩展:在Ruby中,有种邪恶的方式可以得到任何规则的豁免来访问任何方法,包括private,即send方法。
Ruby中的类操作
···········在Ruby中,用class关键字定义一个类,
··········如果这个类不存在,那么会创建这个类,如果这个类存在了,则会对已有的类添加方法、属性等。这个操作对自带的类同样有效。如书上的一个例子,去除字符串中非字母、数字、空格的其他符号。想到的是一个用正则表达式来处理的方法:
def to_alphanumeric(s)
s.gsub /^\w\s/, ”
end
class String
def to_alphanumeric
gsub /^\s\w/, ”
end
··············于是在String中多了一个新的方法to_alphanumeric。 ps:这是我第一次知道可以有这样的定义方式,这让我感到耳目一新,就像开了一扇窗,外面全都是新的景色。
···········“打开”类添加方法的操作看起来很酷,但是仔细思考的话,其实是存在一定问题的:如果在String中,已经存在了to_alphanumeric方法,那么调用时是不能确定调用到哪个方法的。
Ruby中的常量和模块
·······用大写字母开头来表示一个常量。常量只在当前作用域下有效,类似于目录树的结构,其他作用域下的同名常量就像是不同目录下的同名文件,是不相关的。
··········从随笔开始的示意图中,Module是Class的superclass,其实Module(模块)就是一些实例方法的集合,和Class就是封装了若干功能的Module(如new()方法)。Module和Class非常类似,但是使用又截然不同,当需要被继承或者实例化的时候,应该选用Class(superclass()方法和new()方法),而当需要被其他地方包含(include、import)时,应该使用模块。
···········模块就像是目录,模块中的不同常量(方法或者属性的引用)就可以看成是文件,常量和模块组成一个类似文件树的结构,调用时用双冒号来表示路径(::)。用加上路径的显示方式可以唯一确定到常量的位置,这就是命名空间的概念。
- Ruby对象模型 -整理
- Ruby的对象模型
- Ruby和JavaScript对象模型的比较
- Ruby 中的对象和类模型
- ruby元编程——对象模型
- C++对象模型详解(整理)
- 继承的对象模型整理
- Ruby on Rails中的ORM(对象关系模型)一。
- Ruby元编程-学习笔记(一)-对象模型
- Ruby元编程-学习笔记(一)-对象模型
- (整理)Ruby的基础知识
- (整理)Ruby的基础知识
- ruby基础整理
- ruby常用gem整理
- Ruby分布式对象
- Ruby分布式对象
- Ruby 101:方法对象
- Ruby 冻结对象
- linux kernel - task_struct 各个成员 浅析
- 【待写】大型工程的Makefile管理与生成方案:ruby脚本+模块
- 欢迎使用CSDN-markdown编辑器
- HTML5:localStorage
- 视差特效
- Ruby对象模型 -整理
- 209. Minimum Size Subarray Sum
- 看我一个毕业一年的小菜是怎么对自己规划的,各路神仙请参考和指点
- 关于RxJava最友好的文章
- 还有60来天考研,FIGHTING!!!
- ROC曲线绘制及AUC计算
- repo下载国内链接android源码
- 树、二叉树概念
- VMware虚拟机中的CentOS安装Nginx后本机无法访问的解决办法