【问题标题】:Usability of infinite loop in RustRust 中无限循环的可用性
【发布时间】:2016-09-11 18:03:18
【问题描述】:

Rust 包含loop,它是专门为无限循环设计的:

使用关键字loopRust 提供了一种无限循环的方法,直到 到达某个终止语句(如程序退出)

当我希望我的循环永远运行时,我想不出一个单一的场景。是否存在无限循环有用的场景?

【问题讨论】:

  • 为什么要投反对票?我相信这是一个合理的问题,答案帮助我理解了这个概念。

标签: rust infinite-loop


【解决方案1】:

loop 通常用于我们想要在循环体中间中断的循环。也就是说,你想在测试任何条件之前做一些事情,然后如果满足某个条件就退出循环,然后做一些必须在测试条件后才能做的事情,然后重复。在其他语言中,这通常呈现为while (true)for (;;)。这种情况很常见,Rust 决定通过保留一个关键字来声明没有入口条件的循环来接受这种模式。

此外,Rust 没有 C 的 do..while 循环,它在迭代结束时测试条件,但不是在第一次迭代之前。在 Rust 中,您可以在循环结束时使用 loopif condition { break } 语句来模拟它。 do..while 循环在实践中比较少见,根据我的经验,比“中间中断”循环还要少。

【讨论】:

    【解决方案2】:

    我经常在我期望用户持续输入的程序中使用loop,例如在命令行游戏中:

    fn play() {
        let mut game = Game::new();
    
        loop { game.turn() }
    }
    

    由于可能的输入错误,它也很有用 - 在每个回合中,它们可以打印给玩家,并且游戏可以继续,只要玩家想要,直到胜利、失败或辞职breaks 循环。

    【讨论】:

    • 你的意思是无限循环在整个游戏过程中运行?怎么样,它不会导致程序崩溃?如果我在 Python 或 Javascript 中执行此操作,我将遭受程序/网站崩溃。
    • 它没有,因为每个回合都需要用户输入; CPU 不会不断地执行计算——它们只有在收到一些用户反馈后才会完成。
    • 我实际上希望在这里有一些while let Some(xx) = user.input() { game.turn(); },因为我希望在某些时候用户会想要退出......
    • 如果中断条件很简单,那就没问题了。在我的情况下,我以Results 处理输入(并且不想在Error 上退出),还有一段额外的代码可以在每回合开始时评估游戏状态,并允许在输入后立即退出.
    【解决方案3】:

    嵌入式程序中的主循环。嵌入式设备通常希望只要它们打开就可以运行。两段主要代码通常是事件处理程序和主循环。如果有主循环,它将永远运行。

    主循环可能有一个"wait for interrupt",或者它可能只是不断地将其 CPU 资源用于找出实现其目标的更好方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-07
      • 2015-08-29
      • 2019-03-15
      • 2012-12-24
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      相关资源
      最近更新 更多