fn r(n: i32) -> i32 {
if n > 0 {
0
}
1
}
像上面这个函数,编译会报错,如下:
|
2 | / if n > 0 {
3 | | 0
| | ^ expected `()`, found integer
4 | | }
| | -- help: consider using a semicolon here
| |_____|
| expected this to be `()`
看的出来编译器认为这个函数返回的是unit ()
,而if
里面的0
却是integer
,所以报错了
我知道下面2种做法可以编译通过:
把
1
放进else
里面在
0
前面显式的加上return
现在问题来了: 这个编译不通过的函数,我标注了返回类型为i32
,而且函数体内怎么看返回的也不是()
啊,为什么编译器会认为返回的是()
类型呢?
希望各位大佬指点一下小弟!
---
javasaint 2019-12-18 17:57
我来分析一下,rust初学者,可能术语用得不太恰当,但差不多应该是这个意思
fn r(n: i32) -> i32 { if n > 0 { 0 } 1 }
rust编译器认为函数体是由一个语句和表达式组成的 if n > 0 { 0 } 和 1
因为没有else,所以它不认为if 代码块是表达式的一部份 所以做为函数返回值的是 1 这个表达式
第一个语句中的代码块的最后一行是表达式,但其它本身又不是条件赋值语句,所以编译器认为代码块应该返回的是(),也就是unit类型
c5soft 2019-12-18 21:26
if 作为rust的表达式,要求 if 和 else 两部分类型相同,如果缺少 else 部分,else部分默认是(), 这样就要求 if 部分求值结果也是()。
作者 ilp64 2019-12-19 09:26
谢谢各位大佬????,小弟这下清楚了
dongdong 2019-12-20 14:02
不错的问题,学习了。