为什么“if return”在Rust中能够编译通过?

3

我在dtolnay的令人费解的 Rust quiz中发现了一些奇怪的Rust代码。显然,这是一个有效的Rust程序(playground):

fn main() {
    if return { print!("1") } {}
}

根据Rust文档
if表达式的语法是一个条件操作数,后跟一个结果块,任意数量的else if条件和块,以及可选的尾随else块。条件操作数必须具有布尔类型。 对我来说,这意味着return语句必须以某种方式评估为布尔值,否则代码将无法编译。但是,这种解释似乎很荒谬,我怀疑还有其他事情发生了。
那么为什么if return会编译呢?

3
return表达式的类型是 !,它可以被强制转换为任何类型(在这种情况下,是布尔类型)。 - eggyal
2个回答

5

出于同样的原因,以下代码也可以编译:

fn create_string() -> String {
    std::process::exit(0);
}

上述函数的主体部分从未返回String值。但是,由于std::process::exit()是一个发散函数(即其返回类型为!),因此它会产生有效的代码:控制流永远不会到达需要生成String值的地方。

panic!()也是如此。以下代码用panic!()替换了return,同样出于相同的原因编译通过:

fn main() {
    if panic!() { print!("1") } {}
}

4
你正在寻找 never 类型,它是 return 表达式的结果。

虽然它可以编译通过,但会生成一个警告:

warning: unreachable block in `if` or `while` expression
  |
2 |     if return { print!("1") } {}
  |        ---------------------- ^^ unreachable block in `if` or `while` expression
  |        |
  |        any code following this expression is unreachable

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接