【问题标题】:Ruby's redo method vs while loopRuby 的 redo 方法 vs while 循环
【发布时间】:2015-05-29 22:27:35
【问题描述】:

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

【问题讨论】:

    标签: ruby while-loop redo


    【解决方案1】:

    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 解决方案那样优雅,它提供了一种更具表现力的循环控制方式,是对您在其他语言中看到的常规控制的扩展,例如continuebreak

    【讨论】:

    • 好答案。你知道redo是否被广泛使用?你经常使用它吗?我从来没有需要它,而是更喜欢用枚举器循环或循环直到我爆发,但我只是一个业余爱好者,所以也许我一直忽略了一个有用的工具。
    • @Cary,我不经常使用它that,但我已经使用过它,与给出的代码非常相似。在遍历无法通过索引控制的集合时,如果出现临时问题(例如用户输入错误数据),有时能够在当前集合元素上重新启动会很方便。
    猜你喜欢
    • 2012-10-02
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2013-09-09
    • 2023-04-02
    相关资源
    最近更新 更多