這部分通常都是每個程式新手剛開始碰到的一個小難關,常常自己卡在迴圈裡面轉啊轉轉不出來,究竟我們為什麼會需要迴圈呢? 今天就來好好介紹一下這個好東西吧!
我想答案其實很簡單,因為重覆阿,主要因為在程式設計的資料呈現或是取得上,會不斷透過相同的指令去重覆進行,所以就有了迴圈這樣的方法產生了。比如說要你依序取出特定的資料或是印出一些字串,你應該很懶得自己一樣樣的取出或印出吧,如果一個指令就能自動全部拿到或是幫你重覆執行相同動作的話,何樂而不為呢?
在 Ruby 裡面的迴圈主要有以下五種:
for
while
loop
method
(Ruby 特有)迭代
(常用)很多時候這兩個類型定義其實很模糊,主要差別是:
- 迴圈: 執行完特定圈數就沒了
- 迭代: 是要針對每個對象去進行(或遍歷),也是一種迴圈的方式,會執行到每個對象都完成後才會停止。
for in 迴圈使用的格式通常是 For 單數名 in 複數名
通常這兩者之間會用同樣的名字的單複數,比較可以明確表達你要取得一堆東西(複數)裡面的個別資料,你要取不相關的名稱也是可以。
names = ["Sean", "Ken", "John", "Tom"]
for name in names
puts name
end
# 印出"Sean", "Ken", "John", "Tom"
使用這類的迴圈要小心不要變成無窮迴圈,要設定清楚結束條件,不然形成無權迴圈可是會讓你的程式執行卡住喔! 結束的條件會設定在 while 後面,後面再進行特定動作直到達成結束條件後結束。
x = 0
while x < 10 #結束條件
puts x
x += 1 #改變條件
end
#依序印出 1~9
這邊一樣又出現了 ruby 的邪惡分身,非母語的比較不直觀,可以依照個人喜好選用。
x = 0
until x >= 10 #結束條件
puts x
x += 1 #改變條件
end
# 印出1~9 (大於等於10就停止)
與 while 類似,但是需要使用 break 去設定結束條件終止迴圈進行,可以選則使用 do..end 或是{ },這區間都稱作 block,兩者是同樣的作用方式可以互相替換,是 ruby 很重要的觀念喔!
i = 0
loop do
puts i
i += 1 # 改變條件
break if i > 10 # 終止條件
end
# 印出1~9
之前有講到在 ruby 中數字也算是物件,所以 number.method 應該可以很直觀的弄懂,"."後面是接方法吧
.times{}
.upto()
.downto()
#1 .times{} 執行特定次數 (大括號可換用 do...end)
5.times{puts "hello"}
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
使用 each 的方法針對特定資料內所有元素進行迭代。
each
對每個元素each_with_index
可以同時處理每個元素跟索引值# 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
以上就是一些基本的迴圈使用,對於這些方法熟練的話,在一些資料的呈現及選取會很方便喔,花點時間好好學起來吧!
參考資料: