你可以返回一个枚举值:
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
else
分支中返回一个空向量?你需要区分“没有向量”和“空向量”吗?根据我的经验,在一些可为空的语言中,这种差异只会引起麻烦。 - mcarton