Ruby的重做方法与while循环

che*_*ell 5 ruby while-loop redo

我正在阅读这个问题,这让我想到为什么人们会想要使用while循环来代替redo方法.我发现两者之间没有任何区别.我知道redo方法将重新运行代码块,并且while循环将重新运行代码块,只要条件为真.有人可以举例说明你为什么要使用其中一种吗?

pax*_*blo 3

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

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

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
Run Code Online (Sandbox Code Playgroud)

那里提供.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
Run Code Online (Sandbox Code Playgroud)

或在其.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
Run Code Online (Sandbox Code Playgroud)

但它们都没有解决方案那么优雅redo,解决方案提供了一种更具表现力的控制循环的方式,是您在其他语言中看到的常用控件的扩展,例如continuebreak