从 Rust 中的函数返回值有哪些不同的方法?

Ham*_*tar 0 return function rust

我遇到了以下两种方式:

#[derive(Debug)]
struct InputList(i32, i32, i32, i32);
#[derive(Debug)]
struct OutputList(i32, i32, i32, i32);

// Option 1
fn foo(input_list: InputList) -> OutputList {
    return OutputList(input_list.0, input_list.1, input_list.2, input_list.3);
}

// Option 2
fn bar(input_list: InputList) -> OutputList {
    OutputList(input_list.0, input_list.1, input_list.2, input_list.3)
}

fn main() {
    let input_list1 = InputList(1, 2, 3, 4);
    let input_list2 = InputList(6, 7, 8, 9);

    println!("foo() invocation output: {:?}", foo(input_list1));
    println!("bar() invocation output: {:?}", bar(input_list2));
}
Run Code Online (Sandbox Code Playgroud)

只有这两种选择吗?

She*_*ter 7

  1. 在函数的尾部位置有一个没有分号的表达式。

    fn implicit() -> i32 {
        1
    }
    
    Run Code Online (Sandbox Code Playgroud)

    也可以看看:

  2. 使用return声明。

    fn explicit() -> i32 {
        return 1;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    也可以看看:


    宏可以包含return它们的内部报表,所以你可能并不总是看到return

    macro_rules! thing {
        ($val:expr) => {{
            if $val {
                return 42;
            }
        }};
    }
    
    fn macro() -> i32 {
        thing!(true);
        99
    }
    
    Run Code Online (Sandbox Code Playgroud)

    也可以看看:

  3. ?在返回类型实现的函数中使用Try

    fn error() -> Option<i32> {
        None?;
        Some(42)
    }
    
    Run Code Online (Sandbox Code Playgroud)

    也可以看看:

其他情况

根据您对“从函数返回”的确切分类方式,这些也可能适用:

  1. 使用.await异步功能。

    async fn sometime() -> i32 {
        async { 42 }.await;
        99
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这是一个棘手且不明显的问题,因为编译器重写了函数以包含状态机并实现Future特征。每个都.await可以返回 a Poll::Pending,但函数的调用者永远不必考虑这一点。

    也可以看看:

  2. 恐慌。

    fn bail_out() -> Option<i32> {
        panic!()
    }
    
    Run Code Online (Sandbox Code Playgroud)

    在这里,函数“返回”,但通常不会得到值。

    也可以看看:


归档时间:

查看次数:

103 次

最近记录:

5 年,6 月 前