2017-07-07 111 views
0

在這段代碼,破壞性字符串賦值

def string_assignment_original_name(name) 
    save_name = name 
    name.upcase! 
    name 
end 

如果name = "Bob",輸出將"BOB"。同時,在此代碼,

def string_assignment_save_name(name) 
    save_name = name 
    name.upcase! 
    save_name 
end 

如果name = "Bob",輸出也"BOB"

爲什麼會出現這種情況?

+0

閱讀此https://stackoverflow.com/questions/612189/why-are-exclamation-marks-used-in-ruby-methods –

+0

'save_name = name'是這裏的關鍵。 –

+0

爲什麼不呢? ....... – sawa

回答

3

Ruby變量基本上是「對象引用」,它是內部的一種指針。 namesave_name在就地修改之前和之後都指向相同的對象。

看的name.object_idsave_name.object_id結果,看看如何發揮出來,因爲該方法是一個窗口到什麼內部發生了:

name = "bob" 
name.object_id 
# => ...2980 

save_name = name 
save_name.object_id 
# => ...2980 

name.upcase! 
name.object_id 
# => ...2980 

現在,如果你通過像.dup或方法複製對象.clone,或者如果你通過一些其他過程中創建一個全新的字符串,那麼它是一個新的對象:

name = name.downcase 
name.object_id 
# => ...8480 

在玩現在你有兩個對象:

name.object_id 
# => ...8480 
save_name.object_id 
# => ...2980 

這些object_id值是針對所有意圖隨機但對每個對象實例唯一。如果兩個對象具有相同object_id值它們是同一個對象。†

†技術上對象可以覆蓋其object_id方法返回別的東西,但這種情況很少見。

+0

謝謝!這爲我清除它。 – clockworkpc