前情提要:
在第七天我們透過比較Symbol
和String
,發現字串
比符號
多了更多方法!為了活用string method,今天我們接續前文,來探討一題跟字串有關的題目:
+=和concat有什麼不同? What’s difference between concat and += ?
concat
是英文concatenate
的縮寫,意思是串接(link things together in a chain or series.)我們想知道的是:串接完之後,仍然會指向同一個物件(使用同一個記憶體位置)嗎?
要解答此一問,必須使用前一篇所使用的印出記憶體位置方法.object_id
。
我們來創造一個屬於第八天的、指向第八天的字串物件
的變數tingsmessage
:
tingsmessage = "This is my 8th article! "
p tingsmessage.object_id
記憶體位置在:
47023721077820
第八天呢!鐵人賽新的一週開始,值得歡呼一下:
tingsmessage.concat "Yay! "
p tingsmessage
p tingsmessage.object_id
印出來的結果,仍是在第八天的位置歡呼唷:)
This is my 8th article! Yay!
47023721077820
如果用+=
方法呢?
tingsmessage += "Plus One Everyday! "
p tingsmessage
p tingsmessage.object_id
加了+=
每天都加一篇
這段敘述,結果記憶體位置隨著+
方法而改變了:
This is my 8th article! Yay! Plus One Everyday!
47358398608700
按照第七天文章的結論,讀取相同記憶體位置不會變來變去,時間耗費短,因此concat方法較省時。+ or .concat, what is faster for appending string in Ruby?這篇文章的作者已經在ruby幫我們做了一個串接string的benchmark實驗,非常有趣。
提到了concatenation
串接,通常會和interpolation
插入拿來一起談。
如果我們在明天、想要調整第9天的message呢?
換湯不換藥,其實大部分的訊息字串都是一樣的,只是天數改變,所以我們可以設一個整數變數tingsironmanday
,將數字Number轉為字串String,利用剛剛學的+
方法串再一起:
tingsironmanday = 9
p "I've written " + tingsironmanday.to_s + " articles!"
# => "I've written 9 articles!"
interpolation
概念,就是#{}
大括號包住數字變數,此方法自動會幫我們轉換數字為字串,讓程式碼更簡潔,可讀性更高。:)
p "I've written #{tingsironmanday} articles!"
# => "I've written 9 articles!"
從今天舉的例子們可以發現在ruby裡實作的功能,總是會有不同的寫法,讓我們可以根據情況選擇適合自己最佳的使用時機,這些設計是不是很聰明呢?
===
Ref: