Rust 有没有办法区分正常循环终止和中断终止?

hir*_*ist 11 for-loop control-flow rust

铁锈中的惯用语for/else

在 Python 中,我可以使用for/else检查循环是否for在语句处终止break或“正常”完成:

prod = 1
for i in range(1, 10):
    prod *= i
    if prod > 123:
        break
else:
    print("oops! loop terminated without break.")
Run Code Online (Sandbox Code Playgroud)

Rust 有类似的方法吗?这是我最接近的,但并不是特别相似。

let mut prod = 1u64;
let mut found = false;
for i in 1..10 {
    prod *= i;
    if prod > 123 {
        found = true;
        break;
    }
}
if !found {
    println!("oops! loop terminated without break.");
}
Run Code Online (Sandbox Code Playgroud)

似乎有关于Rust Internals的讨论;然而,这更多的是关于未来的可能性,而不是惯用的。

在 Python 中,惯用的代码被称为pythonic - 是否有一个类似的词来表示惯用的 Rust 代码?

Cha*_*man 5

从 Rust 1.65 开始,您可以打破块,可以选择使用值。RFC 中甚至提到了类似的案例作为动机

let value = 'found: {
    for i in 1..2 {
        prod *= i;
        if prod > 123 {
            break 'found Some(prod);
        }
    }
    println!("oops! loop terminated without break.");
    None
};
Run Code Online (Sandbox Code Playgroud)

游乐场