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

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

不错的问题,学习了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值