下過雨的天空,星星特別明亮。
唯心提著包離開了研究室,今晚的補課依舊在空教室進行。
「還記得妳寫的重複十次Hello World!
的程式嗎?」
詩憶點點頭。「記得學姐提過,有其他更好的方式可以實現。」
fun main() {
println("Hello World!")
println("Hello World!")
println("Hello World!")
//...省略中間重複行數
println("Hello World!")
}
「嗯,這個方式就是迴圈,迴圈是重複的專家。不過Kotlin的迴圈不只一種,最簡單的是repeat
。」唯心迅速地更新了程式碼。
fun main() {
repeat(10) {
println("Hello World!")
}
}
原本需要十行的程式碼,現在只剩下三行。
「這⋯⋯真的是好簡單易懂啊。」詩憶驚喜的睜大眼睛。
「不過,這樣對次數的觀察不太直觀,所以我們就改成列印迴圈變數,數字也減到五次吧,可以直接用預設的名字it
或是用->
另外幫變數命名。」唯心把程式碼獨立成函式另外命名成repeat5
。
fun repeat5() {
repeat(5) {
println(it)
}
}
fun repeat5index() {
repeat(5) { index ->
println(index)
}
}
「印出來的迴圈變數是0, 1, 2, 3, 4
,確實是五次。但是五其實也有很多種組合,在某些時候我們會希望的是 1, 2, 3, 4, 5
,這時可以改用for
搭配rangeTo()
。」
詩憶重複看了好幾次程式碼。「嗯?學姐我沒在妳的程式碼裡看到rangeTo()
函式啊?」
「喔,和之前說的四則運算子邏輯一樣,這個..
符號就是rangeTo
函式的簡寫。」唯心在程式上加上了註解。
fun for1to5() {
for (index in 1..5) { //就是 1.rangeTo(5)
println(index)
}
}
「for
還可以跳著數、倒著數,比如十以下的奇數數量也是五。」唯心興致來了,舉出各種例子。
fun for1to10奇數() {
for (index in 1..10 step 2) {
println(index)
}
}
fun for1to9倒著數奇數() {
for (index in 9 downTo 1 step 2) {
println(index)
}
}
「有時候拿到的結束數字比範圍大,可以自行減掉再用剛剛的rangeTo()
或是直接就用until
,因為until
不含上限。」
「什麼時候會結束數字比範圍大啊?」詩憶好奇地問。
唯心指了指最初的程式碼。「之前不是提到預設的索引是0開始
嗎?所以相對於整個群體的數量,最後一個索引就是數量減一。」
fun for1until6() {
for(index in 1 until 6) {
println(index)
}
}
「而另一種迴圈while
,在做到和for
同樣的事時,寫起來比較繁瑣,所以我們通常是用在for
不能做到的地方,那就是只確定結束條件,不確定次數的情形。例如,需要等待其他函式回傳的結果來結束迴圈,所以也存在while(true)
的設計,這時會搭配break
跳出迴圈,咳。」
fun while5() {
var index = 0
while(index < 5) {
println(index)
index++
}
}
詩憶聽唯心的嗓音有些沙啞,急忙倒出保溫瓶裡的溫水遞給她。
唯心喝了幾口溫水後休息了一會兒,才繼續說下去。
「最後一種迴圈do while
,表面上和while
結果相同,但是有一個相當特殊的特性,就是至少會跑一次,所以就算是while(false)
這種極端的例子,也會印出0
。」
fun dowhile5() {
var index = 0
do {
println(index)
index++
} while(index < 5)
}