从if语句内部返回时类型不匹配

时间:2018-07-02 04:50:53

标签: rust type-mismatch

以下代码无法编译:

fn testing() -> i32 {
    let x = 5;
    if x == 5 {
        5
    }
    6
}

出现此错误:

error E0308: mismatched types. (expected (), found integral variable)

如果将明确的return放在5前面,或者如果将6放在else块内,则一切正常。 Rust到底在抱怨什么?

2 个答案:

答案 0 :(得分:3)

if-else是具有类型的可分配表达式。省略else {}等效于if { ... } else { () }。如果您将该值分配给变量:

// would not compile
let result = if x == 5 {
    5
};

相当于写作:

let result = if x == 5 {
    5
} else {
    ()
};

使result的类型为整数或单位,这是无效的。

答案 1 :(得分:3)

在Rust中,几乎所有内容都是一个表达式,包括if-elseif会产生一个值,但是如果表达式失败(即x != 5),则该表达式没有值。将6放入else块时,if-else语句返回一个整数(由于返回类型的原因,它将为i32)。您可以使用分号取消该语句的值。

return 5(请注意,没有分号)也是一条语句,其结果为()。现在if表达式总是返回(),这很好。

通常,您应该使用else变体,因此可以省略return

fn testing() -> i32 {
    let x = 5;
    if x == 5 {
        5
    } else {
        6
    }
}