廢話不多說,直接開始開始說明Ruby中所有物件的共同特點。
※ 物件的參照(object reference)
『當我們在Ruby中處理物件時,我們實際上在處理物件的參照。我們所操作的不是物件本身,而是一個指向他的參照。當我們對一個變數賦值時,並不是將一個物件複製給該變數;我們只是把指向一個物件的參照存入該變數。』
zzzzZZZZZZ...
我們還是看個例子理解一下:
annie_say = "Hello, ruby!"
#建立一個String物件,將指向此物件的參照存到annie_say中
linda_say = annie_say
=> "Hello, ruby!"
# 將剛剛指向String的參照複製到linda_say
# 此時annie_say與linda_say都指向同一個物件
我們可以這樣檢查,已確定目前兩個變數所存的參照是相同的:
annie_say.object_id => 70148984524720
linda_say.object_id => 70148984524720
接下來,運用linda_say的參照來修改對應到的物件
linda_say[0,5] = "Hi,hi"
print annie_say
=> "Hi,hi, ruby!"
# 被指向的物件已經因上一行而被改過了
# 因此印出annie_say時自然將被改過後的字串印出
現在新建立了一個物件,並把指向此物見的參照存到linda_say中
linda_say = "Hello, Annie!"
檢查一下linda_say所存的物件參照是否相同:
linda_say.object_id => 70148979897180
# 確實所存的參照位置已不相同
最後印出的結果:
print annie_say + " " + linda_say
=> "Hi,hi, ruby! Hello, Annie!"
※ 物件的壽命
我們如果要建立類別的實體,我們會用 .new 這個類別的方法來完成,例如:
s = String.new
a = Array.new
h = Hash.new
以上的 .new 都會配置記憶體來保存新建立的物件,然後初始設定都會為空物件的狀態。
s => ""
a => []
h => {}
透過 .new ,一個物件就這樣誕生惹,那什麼時候會往生呢?
『Ruby有採用一個稱為垃圾收集(garbage collection)的技術,此技術會自動銷毀不再需要的物件。當一個物件不再被觸及(已無任何參照指向該物件)時,它會成為垃圾收集的對象。』
喔喔,原來愛情中不被愛的才是第三者(大誤),不是啦,當一個物件沒有被任何參照指向時,就會變成垃圾,只是變成垃圾的過程還不是很了解,這部分有機會再深入了解囉!
※ 物件的識別碼
其實這個小節我們已經常常使用,就是物件的.object_id,物件的識別碼在他活著的時候是俱有唯一性的,所以我們經常用這個來檢查兩物件是否為同一物件。
ok,物件這個章節還有很多部分還沒提,明後幾天再娓娓道來,這個部分書中說明的有點深,都要一直查資料,還有自己透過irb來理解,所以可能移次只能提到幾個點,還望大家多多包含!
=================================================
15天,鐵人賽過一半了呢!看到好多大大們都完成30天成就,真是太厲害了!
“Success is the ability to go from failure to failure without losing your enthusiasm.” Winston Churchill
今天想到這句話,是因為在理解書中物件的說明時有點吃力,但還是覺得蠻好玩的,希望可以繼續保持熱情!GOGO!
記得之前有讀過 Ruby 內部實作的文章,雖然忘得差不多XD 一時間也找不到那篇文章在那裡,不過書中提到的「參照」其實就是 C 語言的 Pointer 。
C 語言有提供 Pointer 這個工具,它的用途是將某個變數的記憶體位址指向它,也就是說 Pointer 變數裡面存的是其指向之變數的記憶體位置而不是它的值,而我們可以透過 Pointer 指向的記憶體位址,去存取那個記憶體位址的內容並且改變它的值。
聽起來感覺繞了一圈,但是如果有寫過的話就會知道 Pointer 在某些處境非常方便。
其實不管是哪個程式語言都一樣,如果想要學得很深,一定會碰到很多計算機名詞,如果想要理解這些東西在幹嘛的話,建議可以去學一下「計算機概論」,了解一下計算機的基本原理。
Kevin指的是C語言的指標對吧,謝謝你的說明!其實有讀了書真的對程式碼的理解會改變,現在在讀程式碼的時候,念在心裡的說明都跟以前不同了,了解變數是指向物件的參照,或指向物件的記憶體位置,就會知道自己正在改變的東西到底是哪一個位置的東西!
計算機概論我真的得好好研究才行,因為我發現我很有興趣了解記憶體存取方式的運作,也很想知道當Ruby把用不到的物件殺死時,記憶體的位置會有什麼變化,不曉得是不是就會空下了一格,也很想試著用object_id反查object...,總之心裡多了很多的想法,多虧了有看這本書呢,只是問題越堆越多了XDDDD