5

我正在阅读这个问题,它让我思考为什么在可以使用重做方法的情况下要使用 while 循环。我找不到两者之间的任何区别。我知道 redo 方法会重新运行代码块,只要条件为真,while 循环就会重新运行代码块。有人可以举例说明您为什么要使用其中一个吗?

4

1 回答 1

3

redo命令重新启动循环的当前迭代(例如,不检查终止条件while或推进迭代器for),您仍然需要一些描述的循环(例如while循环)。

您链接到的答案证明了这一点,其中包含:

nums = Array.new(5){[rand(1..9), rand(1..9)]}
nums.each do |num1, num2|
  print "What is #{num1} + #{num2}: "
  redo unless gets.to_i == num1 + num2
end

.each那里提供了循环结构,如果你得到错误的答案,所有要做的redo就是重新启动该循环(不前进到下一个元素)。nums

现在你实际上可以在那里使用一个while循环作为控制循环,只有在你做对的情况下才能前进到下一个

nums = Array.new(5){[rand(1..9), rand(1..9)]}
index = 0
while index < 6 do
    num1 = nums[index][0]
    num2 = nums[index][1]
    print "What is #{num1} + #{num2}: "
    if gets.to_i == num1 + num2 then
        index = index + 1
    end
end

或在.each自身​​内没有redo

nums = Array.new(5){[rand(1..9), rand(1..9)]}
nums.each do |num1, num2|
    answer = num1 + num2 + 1
    while answer != num1 + num2 do
        print "What is #{num1} + #{num2}: "
        answer = gets.to_i
    end
end

但它们都不像redo解决方案那样优雅,它提供了一种更具表现力的控制循环的方式,是对您在其他语言中看到的通常控制的扩展,例如continueor break

于 2015-03-26T01:18:45.007 回答