为什么编译器要求我在此处添加 return 语句?

Cha*_*lie 7 rust

我正在尝试进行沙沙声课程,但我不明白以下代码出现的错误:

pub fn bigger(a: i32, b: i32) -> i32 {
    if a > b {
        a
    }
    b
}
Run Code Online (Sandbox Code Playgroud)

错误:

pub fn bigger(a: i32, b: i32) -> i32 {
    if a > b {
        a
    }
    b
}
Run Code Online (Sandbox Code Playgroud)

如果我添加返回值,它确实有效,但上面的方法不应该也有效吗?如果我使用 if-else 也可以:

pub fn bigger(a: i32, b: i32) -> i32 {
    if a > b {
        a
    } else {
        b
    }
}
Run Code Online (Sandbox Code Playgroud)

Net*_*ave 11

在 rust 中,仅将最后一个表达式作为返回值。

在你的情况下:

if a > b {
    a
}
Run Code Online (Sandbox Code Playgroud)

和:

b
Run Code Online (Sandbox Code Playgroud)

表达式本身就是表达式,那么它应该返回哪一个呢?事实上,if没有子句的表达式在 Rust 中else返回()(这就是类型冲突的原因)。如需更多参考,请参阅此问题

同时:

if a > b {
    a
} else {
    b
}

Run Code Online (Sandbox Code Playgroud)

是单个表达式,其分支也是单个表达式 (ab)。因此很明显,它应该返回表达式内部返回的内容if

另外,您可以在表达式中使用return 语句if来帮助编译器实现在第一种情况下要做什么(来自 @Cerberus 的评论:return x也是一个表达式 - 它的计算结果为 never,因此可以在任何地方使用而不会出现类型不匹配的情况) . ):

pub fn bigger(a: i32, b: i32) -> i32 {
    if a > b {
        return a;
    }
    b
}
Run Code Online (Sandbox Code Playgroud)

仅最后一个b表达式将用作最终返回(其他返回是语句,而不是表达式)。

  • 更准确地说,返回表达式的存在会将整个块的类型更改为“!”,因此您可以在返回表达式之后使用任意类型的表达式,而无需尾随分号,并且它仍然可以编译。 (2认同)