迴圈與迭代 Loop amd Iteration

這部分通常都是每個程式新手剛開始碰到的一個小難關,常常自己卡在迴圈裡面轉啊轉轉不出來,究竟我們為什麼會需要迴圈呢? 今天就來好好介紹一下這個好東西吧!

為甚麼會需要迴圈?

我想答案其實很簡單,因為重覆阿,主要因為在程式設計的資料呈現或是取得上,特別是陣列,會不斷透過相同的指令去重覆進行,所以就有了迴圈這樣的方法產生了。比如說要你依序取出特定的資料或是印出一些字串,你應該很懶得自己一樣樣的取出或印出吧,如果一個指令就能自動全部拿到或是幫你重覆執行相同動作的話,何樂而不為呢?

迴圈種類

在 Ruby 裡面的迴圈主要有以下五種:

  1. for
  2. while
  3. loop
  4. method (Ruby 特有)
  5. 迭代 (常用)

迴圈和迭代 Loop vs Iteration

很多時候這兩個類型定義其實很模糊,主要差別是:

  • 迴圈: 執行完特定圈數就沒了
  • 迭代: 是要針對每個對象去進行(或遍歷),也是一種迴圈的方式,會執行到每個對象都完成後才會停止。

For 迴圈 (for…in)

for in 迴圈使用的格式通常是 For 單數名 in 複數名
通常這兩者之間會用同樣的名字的單複數,比較可以明確表達你要取得一堆東西(複數)裡面的個別資料,你要取不相關的名稱也是可以。

1
2
3
4
5
6
names = ["Sean", "Ken", "John", "Tom"]
for name in names
puts name
end

# 印出"Sean", "Ken", "John", "Tom"

While 迴圈

使用這類的迴圈要小心不要變成無窮迴圈,要設定清楚結束條件,不然形成無權迴圈可是會讓你的程式執行卡住喔! 結束的條件會設定在 while 後面,後面再進行特定動作直到達成結束條件後結束。

1
2
3
4
5
6
7
x = 0
while x < 10 #結束條件
puts x
x += 1 #改變條件
end

#依序印出 1~9

邪惡分身 Evil Twins:

這邊一樣又出現了 ruby 的邪惡分身,非母語的比較不直觀,可以依照個人喜好選用。

  • until = while not
  • while = until not
1
2
3
4
5
6
x = 0
until x >= 10 #結束條件
puts x
x += 1 #改變條件
end
# 印出1~9 (大於等於10就停止)

loop 迴圈

與 while 類似,但是需要使用 break 去設定結束條件終止迴圈進行,可以選則使用 do..end 或是{ },這區間都稱作 block,兩者是同樣的作用方式可以互相替換,是 ruby 很重要的觀念喔!

1
2
3
4
5
6
7
i = 0
loop do
puts i
i += 1 # 改變條件
break if i > 10 # 終止條件
end
# 印出1~9

method 迴圈

之前有講到在 ruby 中數字也算是物件,所以 number.method 應該可以很直觀的弄懂,”.”後面是接方法吧

  • .times{}
  • .upto()
  • .downto()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#1 .times{} 執行特定次數 (大括號可換用 do...end)
5.times do
puts "hello"
end
# 印出 5次"hello"
#2 .upto() 由小到大(想像.upto後面用小括號接參數)
1.upto(10) do |i|
puts "hello, ruby #{i}"
end

#3 .downto() 由大到小
10.downto(1) do |i|
puts "hello, ruby #{i}"
end

迭代式迴圈 (ruby 常用)

使用 each 的方法針對特定資料內所有元素進行迭代。

  • each 對每個元素
  • each_with_index 可以同時處理每個元素跟索引值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# each
names = ["Sean", "Ken", "John", "Tom"]
x = 0
names.each do |name|
puts "#{x} #{name}"
x += 1
end
# 印出 0 Sean, 1 Ken, 2 John, 3 Tom

# each_with_index ,效果同上
names = ["Sean", "Ken", "John", "Tom"]
x = 0
names.each_with_index do |name, x|
puts "#{x} #{name}"
x += 1
end
# 印出 0 Sean, 1 Ken, 2 John, 3 Tom

參考資料:

  1. 為你自己學 Ruby on rails
  2. [Ruby] 迴圈及疊代(Loop and Iterator)