rust 是否退出块表达式?(类似于函数“return”)

guykilcj  于 2022-11-12  发布在  其他
关注(0)|答案(4)|浏览(148)

在到达最后一条语句之前从函数返回可以使用“return”来完成,例如:

fn example() -> i32 {
    if true {
        return 1;
    }

    0 // this line is never reached
}

是否可以对块表达式执行类似的操作?例如:

let foo = {
    if true {
        *something to exit with 1*
    }

    0 // this line is never reached
};

谢谢你的帮助。
P.S.我知道在这个简单的例子中我可以使用“if-else”表达式。我问的是一般的块表达式,而不是这个例子:)

ss2ws0br

ss2ws0br1#

在Rust 1.65.0中,可以命名块并从中断开:

fn main() {
    let foo = 'bar: {
        if true {
            break 'bar 1;
        }

        0 // this line is never reached
    };
}

在Rust 1.65.0之前,有一个众所周知的“loop hack”:

fn main() {
    let foo = loop {
        if true {
            break 1;
        }

        break 0;
    };
}
vcirk6k6

vcirk6k62#

您也可以使用立即调用的闭包。

fn main() {
    let foo = (|| {
        if true {
            return 1;
        }

        0
    })();
}

我敢打赌LLVM足够聪明,可以优化发布版本中的函数调用。

fwzugrvs

fwzugrvs3#

不,没有机制可以从区块中提早产生。
有趣的是,这种机制一直是proposed。尝试使用break -label语法(在循环中使用)执行此操作将导致以下错误:
第一个
因此,这将工作在 nightly 编译器与#![feature(label_break_value)]。然而,我不会等待你的呼吸,它是稳定的任何时候。

jmo0nnb3

jmo0nnb34#

我认为目前还不可能,但我发现了这个跟踪问题:https://github.com/rust-lang/rust/issues/48594

相关问题