首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Rust问答】关于函数不写return时候返回值的疑惑

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

作者头像
MikeLoveRust
发布2019-12-25 17:49:41
发布2019-12-25 17:49:41
3.1K00
代码可运行
举报
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
复制
fn r(n: i32) -> i32 {
    if n > 0 {
        0
    }
    1
}

像上面这个函数,编译会报错,如下:

代码语言:javascript
代码运行次数:0
运行
复制
  |
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

不错的问题,学习了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档