【问题标题】:What are the different ways to return a value from a function in Rust?从 Rust 中的函数返回值有哪些不同的方法?
【发布时间】:2020-11-24 20:03:25
【问题描述】:

我遇到了以下两种方式:

#[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));
}

只有这两个选项吗?

【问题讨论】:

    标签: function rust return


    【解决方案1】:
    1. 在函数的尾部位置有一个不带分号的表达式。

      fn implicit() -> i32 {
          1
      }
      

      另见:

    2. 使用return 声明。

      fn explicit() -> i32 {
          return 1;
      }
      

      另见:


      宏可以在其中包含return 语句,因此您可能并不总是看到return

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

      另见:

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

      fn error() -> Option<i32> {
          None?;
          Some(42)
      }
      

      另见:

    其他情况

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

    1. 在异步函数中使用.await

      async fn sometime() -> i32 {
          async { 42 }.await;
          99
      }
      

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

      另见:

    2. 恐慌。

      fn bail_out() -> Option<i32> {
          panic!()
      }
      

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

      另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-20
      • 2013-01-07
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2022-11-19
      相关资源
      最近更新 更多