Какими способами можно вернуть значение из функции в Rust? - PullRequest
0 голосов
/ 04 августа 2020

Я нашел два следующих пути:

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

Это единственные два варианта?

1 Ответ

7 голосов
/ 04 августа 2020
  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!()
    }
    

    Здесь функция «возвращается», но обычно вы не получаете значение.

    См. также:

...