while 修饰符

在第二个版本的循环中(sleep while tired),要执行的循环代码(sleep)优先于测试条件(while tired)。该语法被称为“while 修饰符”(while modifie)。如果你想要使用此语法执行多个表达式,可以将它们放在 beginend 关键字之间:

  1. begin
  2. sleep
  3. snore
  4. end while tired
1loops.rb

这个示例展示了各种替代语法:

  1. $hours_asleep = 0
  2. def tired
  3. if $hours_asleep >= 8 then
  4. $hours_asleep = 0
  5. return false
  6. else
  7. $hours_asleep += 1
  8. return true
  9. end
  10. end
  11. def snore
  12. puts('snore....')
  13. end
  14. def sleep
  15. puts("z" * $hours_asleep )
  16. end
  17. while tired do sleep end # a single-line while loop
  18. while tired # a multi-line while loop
  19. sleep
  20. end
  21. sleep while tired # single-line while modifier
  22. begin # multi-line while modifier
  23. sleep
  24. snore
  25. end while tired

上面的最后一个示例(多行 while modifier)需要多加注意,因为它引入了一些重要的新特性。当使用 beginend 限定的代码块优先于 while 测试时,该代码总是至少执行一次。在其它类型的 while 循环中,代码可能永远都不会执行,除非布尔测试开始为 true。

确保循环至少执行一次

通常 while 循环会执行 0 次或多次,因为布尔测试先于循环体执行;如果布尔测试在开始时就返回 false,则循环体内的代码永远不会运行。但是,当 while 循环属于 beginend 包裹的代码块类型时,循环将执行 1 次或多次,因为循环体内的代码先于布尔表达式执行。
2loops.rb
要了解这两种类型的 while 循环的行为差异,请运行 2loops.rb。这些示例应该有助于阐明该问题: x = 100 # The code in this loop never runs while (x < 100) do puts(‘x < 100’) end # The code in this loop never runs puts(‘x < 100’) while (x < 100) # But the code in loop runs once begin puts(‘x < 100’) end while (x < 100)