Rust中的多返回类型

5

我有一个在 rust 中返回字符串的库函数 f1,想要更新它以选择性地返回向量。

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"
}

是否可以有多个像f3这样的返回路径?


1
为什么不在else分支中返回一个空向量?你需要区分“没有向量”和“空向量”吗?根据我的经验,在一些可为空的语言中,这种差异只会引起麻烦。 - mcarton
根据您尝试实现的可选返回内容,您可能可以使用 std::option - Joachim Isaksson
1个回答

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")
    }
}

either crate 简化了这种方法:

use either::*;

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

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

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

然而,由于Vec :: new()不会分配内存,返回一个空的Vec同样高效:

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

Playground


either 这个 crate 非常有用! - soulmachine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接