iT邦幫忙

DAY 15
0

Ruby女孩:10萬.times { puts "為什麼?" }系列 第 15

Ruby女孩(15):Ruby物件的生與死

  • 分享至 

  • xImage
  •  

廢話不多說,直接開始開始說明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女孩(14):在Ruby中,萬事萬物都是物件 => true
下一篇
Ruby女孩(16):物件之間相等性的比較
系列文
Ruby女孩:10萬.times { puts "為什麼?" }30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
kevin3372000
iT邦新手 3 級 ‧ 2014-10-15 22:12:57

記得之前有讀過 Ruby 內部實作的文章,雖然忘得差不多XD 一時間也找不到那篇文章在那裡,不過書中提到的「參照」其實就是 C 語言的 Pointer 。

C 語言有提供 Pointer 這個工具,它的用途是將某個變數的記憶體位址指向它,也就是說 Pointer 變數裡面存的是其指向之變數的記憶體位置而不是它的值,而我們可以透過 Pointer 指向的記憶體位址,去存取那個記憶體位址的內容並且改變它的值。

聽起來感覺繞了一圈,但是如果有寫過的話就會知道 Pointer 在某些處境非常方便。

0
kevin3372000
iT邦新手 3 級 ‧ 2014-10-15 22:15:28

其實不管是哪個程式語言都一樣,如果想要學得很深,一定會碰到很多計算機名詞,如果想要理解這些東西在幹嘛的話,建議可以去學一下「計算機概論」,了解一下計算機的基本原理。

0
otiann
iT邦新手 2 級 ‧ 2014-10-16 22:25:43

Kevin指的是C語言的指標對吧,謝謝你的說明!其實有讀了書真的對程式碼的理解會改變,現在在讀程式碼的時候,念在心裡的說明都跟以前不同了,了解變數是指向物件的參照,或指向物件的記憶體位置,就會知道自己正在改變的東西到底是哪一個位置的東西!
計算機概論我真的得好好研究才行,因為我發現我很有興趣了解記憶體存取方式的運作,也很想知道當Ruby把用不到的物件殺死時,記憶體的位置會有什麼變化,不曉得是不是就會空下了一格,也很想試著用object_id反查object...,總之心裡多了很多的想法,多虧了有看這本書呢,只是問題越堆越多了XDDDD

我要留言

立即登入留言