为什么在 Rust 中 while 不是一个表达式

3

我刚接触 Rust,我感觉 loopwhile 的一个主要区别是 loop 是一个返回值的表达式。但是为什么 while 不能是一个表达式呢?像下面这样的代码是无法编译通过的:

fn main() {
    let mut count = 0;
    let x = while count != 2 {
        count += 1;
        count
    };
    println!("{}", x);
}

但也许编译器可以将while代码块解释为:

let x = {
    count += 1; // 1st iteration
    count += 1; // 2nd iteration
    count
};

我知道这看起来语义上很奇怪。但是这是loop存在的唯一原因吗?

我知道while true是不允许的,但你总是可以这样做。

let x = 10;
while x != 11 {
    println!("test");
}

这个代码片段的作用与while true完全相同。


1
循环是用来表示无条件循环的。返回值的循环不是循环的第一个版本。while通常用于副作用,因此while不返回值是很自然的。 - Stargateur
编译器无法保证 while 循环运行的次数。while 循环可能会变得比示例更加复杂。while 循环可以调用函数。或者 "count" 的值可以从文件、用户输入或不保证每次调用返回相同值的函数中检索。在这种情况下,编译器无法知道循环将运行多少次。 - Trec Apps
@taotsi 一个loop即使立即被中断,也总是至少运行一次,因此用于退出的break始终可以生成一个值。一个while可能会执行0次(如果条件立即为false,同样适用于带有空迭代器的for),因此在某些情况下它无法生成返回值,除非语法以某种方式扩展来处理这种情况。 - Masklinn
1个回答

8

为什么 while 不能作为表达式呢?

关于这个问题已经有很多讨论,还有至少一个 RFC。有许多细节需要解决。例如,如果一个 while 在第一次不进入循环体内,该怎么办?

但是这是 loop 存在的唯一原因吗?

当时觉得这是最合理的原因。 loop 也不总是一个表达式!

我知道 while true 是不被允许的

虽然默认启用了相关警告,但是它是被允许的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接