学习ruby一段时间,前段时间一直搞测试和环境部署,ruby基础的东西还不是很了解,买了一本《ruby元编程》一直没功夫细看,最近得了空,干脆系统学习下ruby的基本东西。
看了书,最大的感受就是,ruby将一切皆是对象做的更彻底,所有的数据类型都是对象,”类本身也是对象“
首先我们来了解下,在ruby中对象怎么由什么构成的?
ruby中的对象是实例变量和对类实例方法的引用!
代码
class MyClass def my_method @v =1 end end obj = MyClass.new obj = obj.my_method puts obj.instance_variables
在ruby中,对象的实例变量,被理解为hash,键/值在不同对象可能不一样,实例变量被创建的时间,就是被赋值的时候。如果我们上面代码不执行my_method方法,将打印不出东西。
现在我们还要搞清楚一个东西,类方法与实例方法
从调用来说凡是MyClass.my_methode的方法,叫类方法,
凡是MyClass.new.my_methode的方法,叫实例方法。
我们做一个实验
String.instance_methods == "abc".methods ==> ture String.methods == "abc".methods ==>falas
上面第二个实验说名,类方法与实例方法,是不一样的,如果你在String类方法不等于 实例后的实例方法(类方法还有new等一系列方法)
如果能打开对象,我们就只会看到对象只有实例变量和对一个类的引用,我们无法从实验来证明,但是我们可以这样推断为什么这么做,在我们实例多个对象后,他们共享一个类也就共享同样的方法,但是不同对象实例变量,可能不一样,所以实例变量保存在对象中。
为了什么类自身也是对象。
首先我们看一下下面的实验
"helloword".class #=>String String.class #=>Class
既然String都能被找到类,那么说明类本身也是对象。
还不信,那么我们再来做一个实验,首先我们知道一个类的方法就是他实例的实例方法
i=false Class.instance_methods(i) #=> [:allocate, :new, :superclass]
看看吧 打印出来的东西,是不是有我们熟悉的东西,new,还有以前没有接触的allocate,和一个字面上也知道的东西superclass(超类)。
那我们就再来看看,审视类全貌把
String.superclass #=>object Object.superclass #=>BasicObject BasicObject.superclass #=>nil
我们可以看到BasicObject是所有对象的节点。
那么我再来看看Class对象
Class.superclass #==> Module Module.superclass #=>objectwoen
现在我们可以看到ruby整个ruby对象模型结构
那么当我们调用一个方法ruby又干了什么呢?
ruby中的怎么找到一个方法呢
我们定义的class与module在ruby中只是常量,在ruby查找方法,就像是文件系统,class与module充当的是dir的角色。
当调用某个方法后,我们要了解两个概念,一个是祖先链,一个是接受者,