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?
答案 0 :(得分:4)
如评论中所述,了解此模式的工作原理非常重要。它不是while
的特殊形式,它只是滥用循环测试来执行通常在正文中完成的事情。由于break
和continue
不属于循环测试(除非循环是另一个循环的一部分,在这种情况下,它们将编译,但是打破/继续外部 (),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
。