在到达最后一条语句之前从函数返回可以使用“return”来完成,例如:
fn example() -> i32 {
if true {
return 1;
}
0 // this line is never reached
}
Run Code Online (Sandbox Code Playgroud)
是否可以用块表达式做类似的事情?例子:
let foo = {
if true {
*something to exit with 1*
}
0 // this line is never reached
};
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助。
PS我知道在这个简单的例子中我可以使用“if-else”表达式。我问的是一般的块表达式,而不是特别是这个例子:)
mca*_*ton 10
对于稳定的 Rust,有一个众所周知的“ loophack”:
fn main() {
let foo = loop {
if true {
break 1;
}
break 0;
};
}
Run Code Online (Sandbox Code Playgroud)
对于 nightly,有一个不稳定的功能label_break_value可以做到这一点:
#![feature(label_break_value)]
fn main() {
let foo = 'bar: {
if true {
break 'bar 1;
}
0 // this line is never reached
};
}
Run Code Online (Sandbox Code Playgroud)
通过查看 Github 问题,此功能是否会稳定下来似乎并不明显。它已经实施了 2 年多,但似乎没有足够的支持者来推进。
您还可以使用立即调用的闭包。
fn main() {
let foo = (|| {
if true {
return 1;
}
0
})();
}
Run Code Online (Sandbox Code Playgroud)
我敢打赌,LLVM 足够聪明,可以优化发布版本中的函数调用。
不,没有机制可以提前从块中屈服。
有趣的是,已经提出了这种机制。尝试使用break-label语法(在循环中使用)这样做将导致错误:
let foo = 'a: {
if true {
break 'a 1;
}
0
};
Run Code Online (Sandbox Code Playgroud)
let foo = 'a: {
if true {
break 'a 1;
}
0
};
Run Code Online (Sandbox Code Playgroud)
所以这将适用于夜间编译器#![feature(label_break_value)]。但是,我不会因为它很快就会稳定下来而屏住呼吸。
| 归档时间: |
|
| 查看次数: |
276 次 |
| 最近记录: |