ITPub博客

首页 > 数据库 > 数据库开发技术 > 【Rust问答】关于函数不写return时候返回值的疑惑

【Rust问答】关于函数不写return时候返回值的疑惑

原创 数据库开发技术 作者:Rust语言中文社区 时间:2019-12-23 11:27:33 0 删除 编辑
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. 把1放进else里面

  2. 在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

不错的问题,学习了。


原文作者:Rust语言中文社区;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-06-11

  • 博文量
    1769
  • 访问量
    718485