鐵 人
Ruby女孩(8):字串迭代小練習!
2014.Oct.08

今天一開始先來介紹,怎麼把字串分開列出來!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,所以字也改變了!

一開始對上面例子的 lengthbytesize 的差異感到很疑惑,後來查了資料才知道,在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!

Ruby女孩(9):老媽,你不能決定,讓我用紅寶石的陣列幫你決定吧!
2014.Oct.09
Ruby女孩(7):原來字串也可以比大小?
2014.Oct.07
comments powered by Disqus