溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

學習札記——ruby的對象模型

發(fā)布時間:2020-07-16 05:58:52 來源:網(wǎng)絡 閱讀:444 作者:JackSongBlack 欄目:編程語言

學習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)用某個方法后,我們要了解兩個概念,一個是祖先鏈,一個是接受者,



向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI