Rust中if-else语句如何影响函数的返回值规则?
Rust if-else 表达式返回规则说明
首先明确两个Rust的核心基础规则,你遇到的编译差异和这两个规则直接相关,「函数返回最后一条被求值的表达式的值」的规则从来没有被改变:
- Rust中的
if是表达式而非语句,所有表达式都会求值返回一个值,且同一个表达式的所有分支返回类型必须完全一致。 - 不带
else的if表达式存在隐含的else分支,该分支默认返回单元类型()(可以理解为其他语言的空返回值void)。
第一个无else的代码编译失败原因
你的代码中if分支的最后一个表达式是number + 1,返回类型为u64,但隐含的else分支返回(),两个分支类型不匹配,直接触发了if表达式的类型校验错误,还没有轮到函数返回规则生效。
如果你希望这段代码能编译通过,只需要把if块内的表达式末尾加上分号,主动丢弃它的返回值,让if块的返回值变为(),就能和隐含else分支的类型匹配:
fn return_numbere(number: u64) -> u64 { if (number > 40) { number + 1; // 加;后该表达式返回() } number - 1 }
这时候函数返回的就是最后一个表达式number -1的值,完全符合你已知的基础规则。
第二个带else的代码编译成功原因
当你显式添加else分支后,隐含的else分支会被覆盖,此时if分支返回u64类型的number +1,else分支返回u64类型的number -1,两个分支类型完全匹配,整个if-else表达式的返回类型就是u64。
同时这段代码中if-else是函数的最后一个表达式,所以它的求值结果直接作为函数返回值,没有修改任何基础规则。
内容的提问来源于stack exchange,提问作者Enrique Ortiz Casillas
相关产品推荐
相关产品推荐

