退出块表达式?(类似于函数“返回”)
在到达最后一条语句之前从函数返回可以使用“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
};
谢谢你的帮助。
PS我知道在这个简单的例子中我可以使用“if-else”表达式。我问的是一般的块表达式,而不是特别是这个例子:)
回答
对于稳定的 Rust,有一个众所周知的“ loophack”:
fn main() {
let foo = loop {
if true {
break 1;
}
break 0;
};
}
对于 nightly,有一个不稳定的功能label_break_value可以做到这一点:
#![feature(label_break_value)]
fn main() {
let foo = 'bar: {
if true {
break 'bar 1;
}
0 // this line is never reached
};
}
通过查看 Github 问题,此功能是否会稳定下来似乎并不明显。它已经实施了 2 年多,但似乎没有足够的支持者来推进。
回答
您还可以使用立即调用的闭包。
fn main() {
let foo = (|| {
if true {
return 1;
}
0
})();
}
我敢打赌,LLVM 足够聪明,可以优化发布版本中的函数调用。
回答
我认为目前不可能,但我发现了这个跟踪问题:https : //github.com/rust-lang/rust/issues/48594
回答
不,没有机制可以提前从块中屈服。
有趣的是,已经提出了这种机制。尝试使用break-label语法(在循环中使用)这样做将导致错误:
let foo = 'a: {
if true {
break 'a 1;
}
0
};
let foo = 'a: {
if true {
break 'a 1;
}
0
};
所以这将适用于夜间编译器#![feature(label_break_value)]。但是,我不会因为它很快就会稳定下来而屏住呼吸。