[Day07] 香吉士的眉毛是不是跟迴圈很像呢?
講完了 if/else
判斷式,今天要介紹的是~迴~圈!(音樂下)
在學程式語言之前,其實就有聽過迴圈(Loop)這個詞了,記得當時感覺是一個非常高大上的存在,不過在真正學了迴圈以後,才發現天啊也太好用了吧!根本是新手工程師的好麻吉!
迴圈是一種只出現一次,但可能會連續執行多次的程式碼,它在技術圈內可說是炙手可熱,由於這種優秀的特性,讓我們在 coding 時能避免重複寫相同的 code ,充分發揮懶惰的美德,這是多麽美好的事情啊!這年頭,沒有迴圈,誰敢說自己是程式語言?
通常當需要把一個集合裡的元素一個個拿出來,並執行特定且重複的動作時,就會利用迴圈來幫我們達成目的。
在 Ruby 裡,有 5 種常見的迴圈:
忘了說一件很重要的事,剛剛有提到由於迴圈會連續執行多次,所以在撰寫時必須要告訴它什麼時候要停下來,不然就會像這隻勤勞的小傢伙:
那麼,要怎麼讓天竺鼠停下來呢?(先喝口茶)(被揍!)
簡單來說就是要指定條件,以我知道的有 3 種:
實際用法我會在下面一一介紹,時間緊迫,趕快來看看吧!
for
loop 是一種指定執行次數的迴圈,不過由於要執行的次數會相當於集合內的元素個數,在一般情況下,不需要特別指定執行次數,當集合內的元素都執行過一次後,迴圈就會自動停止了。
我們來看看實際的例子,假設有一個陣列:
generals = ["赤犬", "黃猿", "青雉", "藤虎", "綠牛"]
用 for
迴圈把大將們一個個丟出來吧!(過肩摔)
for general in generals
puts general # 每次要執行的動作
end
# 依序印出:
赤犬
黃猿
青雉
藤虎
綠牛
for
迴圈會把一個集合裡的元素一個個丟出來,在最後一個元素執行結束後,迴圈也會隨即停止。
while
loop 是一種指定執行條件的迴圈,和 for
迴圈的差別是,它需要有一個停下來的條件,不然就會停不下來啊!(莫忘天竺鼠)
我們一樣來看看實際的例子:
bendon_count = 1
while bendon_count < 4
puts "老闆再來一份!我已經吃完#{bendon_count}個便當了"
bendon_count += 1
end
# 依序印出:
老闆再來一份!我已經吃完1個便當了
老闆再來一份!我已經吃完2個便當了
老闆再來一份!我已經吃完3個便當了
# 舉例靈感來自一個每天吃雙拼便當的同學,我想 3 個便當他也是沒問題的!
bendon_count
在一開始的時候為 1
,然後每次跑一次迴圈後,bendon_count
就會增加 1
,因此當 bendon_count
的值在 4
以下時,迴圈會繼續執行,直到 bendon_count
的值等於 4
才會停下。
條件要寫在迴圈裡面!
條件要寫在迴圈裡面!
條件要寫在迴圈裡面!
這件事真的非常重要所以要說三次,剛剛的例子如果寫成這樣:
bendon_count = 1
while bendon_count < 4
puts "老闆再來一份!我已經吃完#{bendon_count}個便當了"
end
bendon_count += 1 # 不小心寫在外面了!!!
在這個迴圈裡,counter += 1
是我設定的條件,為的是讓迴圈最後會在 bendon_count
= 4
停下來。
不過條件如果寫在迴圈外面,對這個 while
迴圈來說,它就不知道什麼時候該停下來,然後...就會一直跑...一直跑...
times
的語法非常好懂,就和英文裡在表示「乘、次數」的意思一樣:
3.times do
puts "賺錢靠算數,投胎靠技術"
end
# 依序印出:
賺錢靠算數,投胎靠技術
賺錢靠算數,投胎靠技術
賺錢靠算數,投胎靠技術
至於這邊 do..end
的語法,在後面幾天會有更詳細的介紹。
upto
/downto
的概念更簡單了,就是依照順序跑迴圈,你要它正就正,要反就反。
1.upto(5) do |i|
puts "開始計時...#{i}"
end
# 依序印出:
開始計時...1
開始計時...2
開始計時...3
開始計時...4
開始計時...5
也可以反過來:
5.downto(1) do |i|
puts "倒數計時...#{i}"
end
# 依序印出:
倒數計時...5
倒數計時...4
倒數計時...3
倒數計時...2
倒數計時...1
甚至字串也可以!
"a".upto("e") do |i|
puts "開始計時...#{i}"
end
# 依序印出:
開始計時...a
開始計時...b
開始計時...c
開始計時...d
開始計時...e
不過字串用 downto
會失敗,之後再來研究!
老實說,我自己在實務上似乎很少用 upto/downto
,常常都是用範圍技 1..5
.each
解決,之後應該偶爾要把它拿出來用(筆記)
最後一種迴圈,又被稱為迭代(iteration),不過我會把它歸類為一種陣列的方法(method),它的特性是把集合裡的所有元素都拿出來執行一次(聽起來怎麼跟 for
迴圈蠻像)
一樣來看個例子!如果我們想知道草帽海賊團裡有哪些成員,可以這樣做:
crew = ["魯夫", "索隆", "烏索普", "娜美", "香吉士", "喬巴", "羅賓", "佛朗基", "布魯克", "吉貝爾"]
crew.each do |partner|
puts partner
end
# 依序印出:
魯夫
索隆
烏索普
娜美
香吉士
喬巴
羅賓
佛朗基
布魯克
吉貝爾
全員到齊!不得不說 .each
是不是很厲害呢?實務上會經常和它打交道的!
今天就先到這邊啦!大家要記得常用迴圈幫助自己少寫重複的 code 喔!明天會繼續介紹美麗的 Ruby 語言!