iT邦幫忙

DAY 8
2

Ruby女孩:10萬.times { puts "為什麼?" }系列 第 8

Ruby女孩(8):字串迭代小練習!

今天一開始先來介紹,怎麼把字串分開列出來!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"}

想到了上面的答案了嗎?放三隻熊來防雷(XD?)

答案是:

=> "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女孩(7):原來字串也可以比大小?
下一篇
Ruby女孩(9):老媽,你不能決定,讓我用紅寶石的陣列幫你決定吧!
系列文
Ruby女孩:10萬.times { puts "為什麼?" }30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言