以下代码无法编译:
fn testing() -> i32 {
let x = 5;
if x == 5 {
5
}
6
}
出现此错误:
error E0308: mismatched types. (expected (), found integral variable)
如果将明确的return
放在5
前面,或者如果将6
放在else
块内,则一切正常。 Rust到底在抱怨什么?
答案 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
-else
。 if
会产生一个值,但是如果表达式失败(即x != 5
),则该表达式没有值。将6
放入else块时,if
-else
语句返回一个整数(由于返回类型的原因,它将为i32
)。您可以使用分号取消该语句的值。
return 5
(请注意,没有分号)也是一条语句,其结果为()
。现在if
表达式总是返回()
,这很好。
通常,您应该使用else
变体,因此可以省略return
:
fn testing() -> i32 {
let x = 5;
if x == 5 {
5
} else {
6
}
}