Ruby雜湊(Hash)和陣列(Array)的指向特性


在Ruby當中如果把相同的變數分配到兩個不同地方,可能利用物件的特性,在兩個地方針對同一個變數進行修改。

一般的複製變數

如果將一個變數指定到另一個變數,該變數會用「複製」的方式指定過去。意思是說原本的物件不會受到影響。

# 當a指定到b的時候,變數會複製過去
# 如果改變b的內容,a並不會跟著改變
a = 10
b = a
b += 10

a
# => 10

Hash和Array是指向變數

但是對Hash來說,指定到不同其他變數時,在不同地方編修該變數,都會互相影響。以Hash為例:

a_hash = {}
b_hash = a_hash
b_hash[:hello] = "world"

a_hash
# => {:hello => "world"}
# hash並不是用「複製」的方式,而是直接指向該變數

當然,如果同樣情況下,我們要用「複製」的方式,就得用不同方式繞過去。

a = Array.new
b = a
c = a
b << 1

c
# => [1]

這邊可能會發生的問題就是如果c這個Array要用於其他用途,就會和a變數產生混淆的情況。