如何在Rust中打破do-while样式循环?

时间:2016-11-01 18:44:55

标签: rust

Rust允许一种do-while循环,例如:

所以C风格:

do {
    something();
} while (test());

可以用Rust编写:

while {
    something();
    test()
}{}

但是在这种情况下使用break会有问题:

所以这个C风格:

do {
    if (something()) {
        break;
    }
} while (test());

无法用Rust编写:

while {
    if (something()) {
        break;
    }
    test()
}{}

无法使用cannot break outside of a loop进行编译。

有没有办法打破这种形式的while循环?

注1)使用原因:在这种情况下,do {...} while test()流量控制而非while test() {...} test()将{}最初进入循环时为false

注意2)使用while {...}流量控制时:在代码正文中调用continue将跳过最后的break检查。

请参阅相关问题:How to wrap a do-while style loop in a macro, maintaining 'continue' flow control?

2 个答案:

答案 0 :(得分:4)

如评论中所述,了解此模式的工作原理非常重要。它不是while的特殊形式,它只是滥用循环测试来执行通常在正文中完成的事情。由于breakcontinue不属于循环测试(除非循环是另一个循环的一部分,在这种情况下,它们将编译,但是打破/继续外部 (),Rust拒绝它们。

使用上述模式模拟break的直接方法是将测试代码移动到一个闭包,可以从return退出:

while (|| {
    if something() {
        return false // break
    }
    test()
})() {}
只需从闭包中返回continue即可以相同的方式模拟

true

如果将其表达为宏,则可能会使意图更清晰。

答案 1 :(得分:1)

你正在思考这个问题。

让我们建立一个真值表:

+-------------+--------+--------+
| something() | test() | Result |
+-------------+--------+--------+
|    true     |  true  |  stop  |
+-------------+--------+--------+
|    true     |  false |  stop  |
+-------------+--------+--------+
|    false    |  true  |  go on |
+-------------+--------+--------+
|    false    |  false |  stop  |
+-------------+--------+--------+

因此,这可以写成:

while !something() && test {}

不需要break