接下來是一個更在你意料之外的概念:`while-loop`(while迴圈)。`while` 迴圈會一直執行它下面的程式碼區段,直到它對應的布林表示式為 `false` 才會停下來。
等等,你還能跟的上這些術語吧?如果我們寫了這樣一個語句:`if items > 5` 或者是 `for fruit in fruits`,那就是在開始一個程式碼區段 (code block),新的程式碼區段是需要被縮排的,最後再以 `end` 語句結尾。只有將程式碼用這樣的方式格式化,Ruby 才能知道你的目的。如果你不太明白這一點,就回去看看 「if 語句」、「函式」和「for 迴圈」章節,直到你明白為止。
接下來的店席將訓練你的大腦去閱讀這些結構化的與集,這和我們將布林表示式燒錄到你的大腦中的過程有點類似。
回到 `while` 迴圈,它所作的和 `if` 語句類似,也是去檢查一個布林表示式的真假,不一樣的是它下面的程式碼區段不是只被執行一次,而是執行完後再趟回到 `while` 所在的位置,如此重複進行,直到 while 表示式為 **false** 為止。
`while` 迴圈有一個問題:那就是有時它會永不結束。如果你的目的是循環到宇宙毀滅為止,那這樣也挺好的,不過其他的情況下你的迴總需要有一個結束點。
為了避免這樣的問題,你需要遵循下面的規定:
1. 盡量少用 `while` 迴圈,大部分時候 `for` 迴圈是更好的選擇。
2. 重複檢查你的 `while` 語句,確定你測試的布林表示式最終會變成 **false**。
3. 如果不確定,就在 `while` 迴圈的結尾印出你要測試的值。看看它的變化。
在這節練習中,你將通過上面的三樣事情學會 `while` 迴圈:
~~~
i = 0
numbers = []
while i < 6
puts "At the top i is #{i}"
numbers.push(i)
i = i + 1
puts "Numbers now: #{numbers}"
puts "At the bottom i is #{i}"
end
puts "The numbers: "
for num in numbers
puts num
end
~~~
## 你應該看到的結果
~~~
$ ruby ex33.rb
At the top i is 0
Numbers now: [0]
At the bottom i is 1
At the top i is 1
Numbers now: [0, 1]
At the bottom i is 2
At the top i is 2
Numbers now: [0, 1, 2]
At the bottom i is 3
At the top i is 3
Numbers now: [0, 1, 2, 3]
At the bottom i is 4
At the top i is 4
Numbers now: [0, 1, 2, 3, 4]
At the bottom i is 5
At the top i is 5
Numbers now: [0, 1, 2, 3, 4, 5]
At the bottom i is 6
The numbers:
0
1
2
3
4
5
~~~
## 加分習題
1. 將這個 `while` 迴圈改成一個函式,將測試條件 `(i < 6)`中的 6 換成一個變數。
2. 使用這個函式重寫你的腳本,並使用不同的數字進行測試。
3. 為函式添加另一個參數,這個參數用來定義第 8 行的 `+1`,這樣你就可以讓它任意加值了。
4. 再使用該函式重寫一遍這個腳本。看看效果如何。
5. 接下來使用 `for` 迴圈和 range 把這個腳本再寫一遍。你還需要中間的加值操作嗎?如果你不去掉它,會有什麼樣的結果?
有可能你會碰到程序跑著停不下來了,這時你只要按著 CTRL 再敲 c (CTRL-c),這樣程式就會中斷下來了。
- 笨方法更简单
- 习题 0: 准备工作
- 习题 1: 第一个程式
- 习题 2: 注释和井号
- 习题 3: 数字和数学计算
- 习题 4: 变数(variable)和命名
- 习题 5: 更多的变数和印出
- 习题 6: 字串(string)和文字
- 习题 7: 更多印出
- 习题 8: 印出,印出
- 习题 9: 印出,印出,印出
- 习题 10: 那是什么?
- 习题 11: 提问
- 习题 12: 模组 (Module)
- 习题 13: 参数、解包、参数
- 习题 14: 提示和传递
- 习题 15: 读取档案
- 习题 16: 读写档案
- 习题 17: 更多的档案操作
- 习题 18: 命名、变数、程式码、函式
- 习题 19: 函式和变数
- 习题 20: 函式和档案
- 习题 21: 函式可以传回东西
- 习题 22: 到现在你学到了哪些东西?
- 习题 23: 阅读一些程式码
- 习题 24: 更多练习
- 习题 25: 更多更多的练习
- 习题 26: 恭喜你,现在来考试了!
- 习题 27: 记住逻辑关系
- 习题 28: 布林(Boolean)表示式练习
- 习题 29: 如果(if)
- 习题 30: Else 和 If
- 习题 31: 做出决定
- 习题 32: 回圈和阵列
- 习题 33: While 回圈
- 习题 34: 存取阵列里的元素
- 习题 35: 分支 (Branches) 和函式 (Functions)
- 习题 36: 设计和测试
- 习题 37: 复习各种符号
- 习题 38: 阅读程式码
- 习题 39: 阵列的操作
- 习题 40: Hash, 可爱的 Hash
- 习题 41: 来自 Percal 25 号行星的哥顿人(Gothons)
- 习题 42: 物以类聚
- 习题 43: 你来制作一个游戏
- 习题 44: 评估你的游戏
- 习题 45: 物件、类和从属关系
- 习题 46: 一个专案骨架
- 习题 47: 自动化测试
- 习题 48: 更进阶的使用者输入
- 习题 49: 创造句子
- 习题 50: 你的第一个网站
- 习题 51: 从浏览器中取得输入
- 习题 52: 创造你的网页游戏
- 下一步
- 一个老程式设计师的建议