今天一開始先來介紹,怎麼把字串分開列出來!Ruby 為字串提供了一個方法: .each_char
,我們來看看例子:
a = "我想要被拆開而且串起來!"
a.each_char { |c| print "-#{c}-" }
執行結果=> "-我--想--要--被--拆--開--而--且--串--起--來--!-"
在 .each_char
的方法後面可以看到一個大括號,這在Ruby 裡我們將大括號稱之為block,裡面可以放我們希望迭代的內容,未來會提到陣列跟雜湊的迭代,這邊只是先簡略說明。
大概可將 a.each_char {|c| puts "-#{c}-"}
拆成兩部分來看:
1. a.each_char #=> 把a的每一個字元丟到後面的block裡。
2. {|c| print "-#{c}-"} #=> 每一個字元到了block裡都叫做c,然後要印出這個字串"-#{c}-"。
(第2點就是看有幾個字元,就要做幾遍!到了陣列Array 與雜湊Hash 時會常常使用block 喔!)
接下來我們可以來算算字串的長度、所占的位元組數目…等。
a = "我愛Ruby"
a.length => 6 #可以知道字串長度是6
a.bytesize => 10 #可以知道字串所佔位元組的數目是10
a.bytesize.times { |i| print a.getbyte(i), " " }
# 上面這可以列出個別的位元組(雖然不知道這可以幹嘛XD?)
a.setbyte(6, a.getbyte(6)+1)
# 上面這串執行後,a現在已經變成"我愛Suby"
# 因為這串語法把第六個位元組的儲存內容+1,所以字也改變了!
一開始對上面例子的 length
和 bytesize
的差異感到很疑惑,後來查了資料才知道,在UTF-8 的編碼中,會使用1 到4 個位元組的浮動長度來編碼,不像Big-5 的編碼都是固定中文字占2 個位元組。以這個例子來說,"我"
和"愛"
都占了3 個位元組!大家也可以到這個網站輸入文字測測它的長度跟位元組。
接下去書中就要提陣列Array 了,但陣列是個大主題,我打算明天再說XD 看了三天的字串下來,我們稍稍用下面這個例子來整理概念!
b = "123456789" #在字串裡放數字
#想想看下面這行code會印出什麼呢?
b.each_char {|x| print x + "1"}
想到了上面的答案了嗎?
答案是:
=> "112131415161718191"
#用each_char把字串拆開後,每個字串後面再接上一個"1"的字串。
答對了嗎XD?
可是,那如果真的想要讓每個數字+1該怎麼做呢?先偷渡一個目前書上還沒看到,但也是字串提供的一個方法:.to_i
.to_i
:可以讓字串轉成數字,例如:
"5566".to_i
=> 5566
#字串"5566"經過to_i之後就變成數字5566了
"Ruby".to_i
=> 0
#Ruby不是數字,所以轉成數字自動改成0
其實數字也可以轉成字串,用的方法是.to_s
2266.to_s
=> "2266"
#方法也可以串接起來:
2266.to_s.to_i
=> 2266
#先變成字串再變成數字!
那這個方法跟剛剛的小例題有什麼關係呢?我們剛剛提到,希望b="123456789"
,可以變成"2345678910"
,我們可以這麼做:
b="123456789"
b.each_char {|x| print x.to_i + 1}
#先把每個字元變成數字,就可以+1了!
執行結果=> "2345678910"
第八天了!
Keep moving forward. One step at a time.
繼續前進!GOGO!