Rust 中的多种返回类型

Chr*_*our 6 rust

我有一个库函数f1rust它返回一个字符串,并希望更新它以选择性地返回一个向量。

fn f1() -> String {
   "abc"
}

fn f2() -> (String, Vec<usize>) {
   "abc", vec![(0, 1, 2)]
}

fn f3(flag: bool) -> ? {
    if (flag)
        "abc", vec![(0, 1, 2)]
    else
        "abc"
}
Run Code Online (Sandbox Code Playgroud)

是否可以有多个返回路径,例如f3

Alo*_*oso 13

您可以返回一个枚举:

enum StrOrStrAndVec<'a> {
    Str(&'a str),
    StrAndVec(&'a str, Vec<usize>),
}

fn f3(flag: bool) -> StrOrStrAndVec<'static> {
    if flag {
        StrOrStrAndVec::StrAndVec("abc", vec![0, 1, 2])
    } else {
        StrOrStrAndVec::Str("abc")
    }
}
Run Code Online (Sandbox Code Playgroud)

either板条箱简化了这种方法:

use either::*;

fn f3(flag: bool) -> Either<&'static str, (&'static str, Vec<usize>)> {
    if flag {
        Right(("abc", vec![0, 1, 2]))
    } else {
        Left("abc")
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,在这种情况下您可以使用Option

fn f3(flag: bool) -> (&'static str, Option<Vec<usize>>) {
    if flag {
        ("abc", Some(vec![0, 1, 2]))
    } else {
        ("abc", None)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,由于Vec::new()不分配内存,因此返回空值Vec同样有效:

fn f3(flag: bool) -> (&'static str, Vec<usize>) {
    if flag {
        ("abc", vec![0, 1, 2])
    } else {
        ("abc", Vec::new())
    }
}
Run Code Online (Sandbox Code Playgroud)

操场