iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 8
2
Modern Web

30天修煉Ruby面試精選30題系列 第 8

Day08 - Ruby比一比: String的+=與concat串接

前情提要:

第七天我們透過比較SymbolString,發現字串符號多了更多方法!為了活用string method,今天我們接續前文,來探討一題跟字串有關的題目:


Ruby經典面試題目 #08

+=和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:


上一篇
Day07 - Ruby比一比: Symbol符號與String字串
下一篇
Day09 - 超級經典面試題: Ruby的 a ||= b (or-equals)是什麼意思呢?
系列文
30天修煉Ruby面試精選30題31

尚未有邦友留言

立即登入留言