iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 7
0
自我挑戰組

滿滿的紅寶石不拿嗎?-- 去吧!我把世界上的一切都放在那裡了! 系列 第 7

迴圈 <> 惡魔風腳開踢!比香吉士的眉毛還會轉 - 滿滿的紅寶石不拿嗎?

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20200915/20128363mRHsOAXgVa.jpg

[Day07] 香吉士的眉毛是不是跟迴圈很像呢?

講完了 if/else 判斷式,今天要介紹的是~迴~圈!(音樂下)

在學程式語言之前,其實就有聽過迴圈(Loop)這個詞了,記得當時感覺是一個非常高大上的存在,不過在真正學了迴圈以後,才發現天啊也太好用了吧!根本是新手工程師的好麻吉!

迴圈是一種只出現一次,但可能會連續執行多次的程式碼,它在技術圈內可說是炙手可熱,由於這種優秀的特性,讓我們在 coding 時能避免重複寫相同的 code ,充分發揮懶惰的美德,這是多麽美好的事情啊!這年頭,沒有迴圈,誰敢說自己是程式語言?

通常當需要把一個集合裡的元素一個個拿出來,並執行特定且重複的動作時,就會利用迴圈來幫我們達成目的。

在 Ruby 裡,有 5 種常見的迴圈:

  • for loop
  • while lopp
  • times
  • upto/downto
  • iteration

忘了說一件很重要的事,剛剛有提到由於迴圈會連續執行多次,所以在撰寫時必須要告訴它什麼時候要停下來,不然就會像這隻勤勞的小傢伙:

那麼,要怎麼讓天竺鼠停下來呢?(先喝口茶)(被揍!)
簡單來說就是要指定條件,以我知道的有 3 種:

  • 指定執行次數
  • 指定特定條件
  • 指定某個集合內的所有元素

實際用法我會在下面一一介紹,時間緊迫,趕快來看看吧!

for loop

for loop 是一種指定執行次數的迴圈,不過由於要執行的次數會相當於集合內的元素個數,在一般情況下,不需要特別指定執行次數,當集合內的元素都執行過一次後,迴圈就會自動停止了。

我們來看看實際的例子,假設有一個陣列:

generals = ["赤犬", "黃猿", "青雉", "藤虎", "綠牛"]

for 迴圈把大將們一個個丟出來吧!(過肩摔)

for general in generals
  puts general # 每次要執行的動作
end

# 依序印出:
赤犬
黃猿
青雉
藤虎
綠牛

for 迴圈會把一個集合裡的元素一個個丟出來,在最後一個元素執行結束後,迴圈也會隨即停止。


while loop

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

times 的語法非常好懂,就和英文裡在表示「乘、次數」的意思一樣:

3.times do
  puts "賺錢靠算數,投胎靠技術"
end

# 依序印出:
賺錢靠算數,投胎靠技術
賺錢靠算數,投胎靠技術
賺錢靠算數,投胎靠技術

至於這邊 do..end 的語法,在後面幾天會有更詳細的介紹。


upto/downto

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

最後一種迴圈,又被稱為迭代(iteration),不過我會把它歸類為一種陣列的方法(method),它的特性是把集合裡的所有元素都拿出來執行一次(聽起來怎麼跟 for 迴圈蠻像)

一樣來看個例子!如果我們想知道草帽海賊團裡有哪些成員,可以這樣做:

crew = ["魯夫", "索隆", "烏索普", "娜美", "香吉士", "喬巴", "羅賓", "佛朗基", "布魯克", "吉貝爾"]

crew.each do |partner|
  puts partner
end

# 依序印出:
魯夫
索隆
烏索普
娜美
香吉士
喬巴
羅賓
佛朗基
布魯克
吉貝爾

全員到齊!不得不說 .each 是不是很厲害呢?實務上會經常和它打交道的!


今天就先到這邊啦!大家要記得常用迴圈幫助自己少寫重複的 code 喔!明天會繼續介紹美麗的 Ruby 語言!


上一篇
流程控制 <> 只要有風和海,我就有辦法航行!- 滿滿的紅寶石不拿嗎?
下一篇
方法 <> 我斑願稱你為最強!站上頂點的方法只有一個 - 滿滿的紅寶石不拿嗎?
系列文
滿滿的紅寶石不拿嗎?-- 去吧!我把世界上的一切都放在那裡了! 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言