Ruby 的 redo 方法与 while 循环
Ruby's redo method vs while loop
我正在阅读 this question,这让我开始思考为什么在可以使用 redo 方法的情况下为什么要使用 while 循环。我找不到两者之间的任何区别。我知道重做方法将重新运行代码块,只要条件为真,while 循环将重新运行代码块。有人可以举例说明您为什么要使用其中之一吗?
redo
命令重新开始循环的当前迭代(例如,不检查 while
中的终止条件或 for
中推进迭代器),您仍然 需要一些描述的循环(例如while
循环)。
您 link 的回答证明了这一点,其中包含:
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
解决方案优雅,它提供了一种更具表现力的循环控制方式,是对您在其他语言中看到的常用控件的扩展,例如 continue
或 break
.
我正在阅读 this question,这让我开始思考为什么在可以使用 redo 方法的情况下为什么要使用 while 循环。我找不到两者之间的任何区别。我知道重做方法将重新运行代码块,只要条件为真,while 循环将重新运行代码块。有人可以举例说明您为什么要使用其中之一吗?
redo
命令重新开始循环的当前迭代(例如,不检查 while
中的终止条件或 for
中推进迭代器),您仍然 需要一些描述的循环(例如while
循环)。
您 link 的回答证明了这一点,其中包含:
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
解决方案优雅,它提供了一种更具表现力的循环控制方式,是对您在其他语言中看到的常用控件的扩展,例如 continue
或 break
.