< 返回版块

hanyuling 发表于 2020-12-08 11:53

Tags:语法

我有以下疑问,希望能得到各位大佬的解答:

fn another_function() -> i32 { 
    5 //表达式
}
fn another_function() -> i32 {
    return 5 //表达式?
}
fn another_function() -> i32 {
    return 5; //语句?
}

上面的判断是否正确?正确的话,语句不是没有返回值的嘛,为什么 return 5; 是有返回值的

评论区

写评论
floydawong 2020-12-09 15:04
fn foo1() -> i32 {
    5
}

fn foo2() -> i32 {
    {
        5
    }
    // 花括号最后一个表达式的值是该花括号的值;
    // foo2返回 {5} 的值, {5} 的值为 5;
}

fn foo3() -> i32 {
    // return 5.0; Error!
    /*
    error[E0308]: mismatched types
      .\test.rs:13:12
       |
    12 | fn foo3() -> i32 {
       |              --- expected `i32` because of return type
    13 |     return 5.0;
       |            ^^^ expected `i32`, found floating-point number

    error: aborting due to previous error

    For more information about this error, try `rustc --explain E0308`.
     */

    // 预期返回`i32`, 所以无论是`return 5`还是`return 5;`, 其结构都是数值5;
    // return 是返回一个值到当前的作用域(花括号)

    5
}

fn main() {
    println!("{}", foo1());
    println!("{}", foo2());
    println!("{}", foo3());
}
whfuyn 2020-12-08 14:34

https://doc.rust-lang.org/stable/reference/expressions/return-expr.html?highlight=return#return-expressions

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=b583ce822528fb4ac7198af9d070135b

return表达式的返回值是个never type,看报错。


error[E0308]: mismatched types
 --> src/main.rs:9:26
  |
9 |     print_type_of::<i32>(&(return 5));
  |                          ^^^^^^^^^^^ expected `i32`, found `!`
  |
  = note: expected reference `&i32`
             found reference `&!`
imkerberos 2020-12-08 14:11

你的理解是正确的, 表达式有值, 而语句没有值.

return 5

是表达式, 其值为 5.

return 5;

是语句, 其值为 (), 但是这个语句有个副作用, 是让函数返回 5. 你看到的 5 是函数的返回值, 而不是本身语句的值.

1 共 3 条评论, 1 页