我在 dtolnay 令人费解的 Rust测验中发现了一些奇怪的 Rust 代码。显然,这是一个有效的 Rust 程序(playground):
fn main() {
if return { print!("1") } {}
}
Run Code Online (Sandbox Code Playgroud)
根据Rust 文档:
if 表达式的语法是一个条件操作数,后跟一个后续块、任意数量的 else if 条件和块,以及一个可选的尾部 else 块。条件操作数必须具有布尔类型。
对我来说,这意味着该return语句必须以某种方式计算为布尔值,否则代码将无法编译。但这种解释似乎很奇怪,我怀疑肯定还有其他原因。
那么为什么要if return编译呢?
出于同样的原因,以下代码可以编译:
fn create_string() -> String {
std::process::exit(0);
}
Run Code Online (Sandbox Code Playgroud)
然而,上面函数的主体永远不会返回String值,因为std::process::exit()是一个发散函数(即,它的返回类型是),因此它会产生有效的代码:控制流永远不会到达必须生成值的!点。String
这同样适用于panic!(). 以下代码将您的替换为return,panic!()也出于相同的原因进行编译:
fn main() {
if panic!() { print!("1") } {}
}
Run Code Online (Sandbox Code Playgroud)