您好,登錄后才能下訂單哦!
學習ruby一段時間,前段時間一直搞測試和環(huán)境部署,ruby基礎的東西還不是很了解,買了一本《ruby元編程》一直沒功夫細看,最近得了空,干脆系統(tǒng)學習下ruby的基本東西。
看了書,最大的感受就是,ruby將一切皆是對象做的更徹底,所有的數(shù)據(jù)類型都是對象,”類本身也是對象“
首先我們來了解下,在ruby中對象怎么由什么構成的?
ruby中的對象是實例變量和對類實例方法的引用!
代碼
class MyClass def my_method @v =1 end end obj = MyClass.new obj = obj.my_method puts obj.instance_variables
在ruby中,對象的實例變量,被理解為hash,鍵/值在不同對象可能不一樣,實例變量被創(chuàng)建的時間,就是被賦值的時候。如果我們上面代碼不執(zhí)行my_method方法,將打印不出東西。
現(xiàn)在我們還要搞清楚一個東西,類方法與實例方法
從調(diào)用來說凡是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是所有對象的節(jié)點。
那么我再來看看Class對象
Class.superclass #==> Module Module.superclass #=>objectwoen
現(xiàn)在我們可以看到ruby整個ruby對象模型結構
那么當我們調(diào)用一個方法ruby又干了什么呢?
ruby中的怎么找到一個方法呢
我們定義的class與module在ruby中只是常量,在ruby查找方法,就像是文件系統(tǒng),class與module充當?shù)氖莇ir的角色。
當調(diào)用某個方法后,我們要了解兩個概念,一個是祖先鏈,一個是接受者,
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。