首页 > 解决方案 > rust 中返回的值如何?

问题描述

我正在尝试学习 rust,到目前为止,我对返回值的理解是,只要后面没有分号,就会返回块内最后一条语句的值。

在下面的代码中x + 1(后面没有分号)被返回并分配给y.

fn main() {
    let x = 5;

    let y = {
        let x = 3;
        x + 1
    };

    println!("The value of y is: {}", y);
}

输出:

The value of y is: 4

但是在下面的代码中,counter * 2虽然它后面有一个分号,但它是如何返回的。

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("The result is {}", result);
}

输出:

The result is 20

标签: rust

解决方案


只要后面没有分号,就会返回块内最后一条语句的值。

从技术上讲,除非被覆盖,否则将返回块的最后一个值。在语法上需要它的特定上下文之外,;真正抑制“当前块”的值并替换()它,正如您通过尝试编译它所看到的那样:

fn main() {
    let a: u8 = { 0; };
}

错误将是E0308 Mismatched Types:由于a是显式输入的,因此 rustc 期望块的值是 anu8并抱怨它得到了 a ()

但是在下面的代码中 counter * 2 是如何返回的,尽管它后面有一个分号。

这是因为有两种方法可以覆盖特定上下文中的返回值,至少目前是这样:

  • return <expr>将立即退出当前函数,结果<expr>为返回值
  • break <expr>将立即从当前loop(或与指定标签匹配的任何一个)退出,结果<expr>为“循环值”,它仅适用于loop(not whileor for) 因为循环必须至少执行一次才能工作

推荐阅读