我有一个库函数f1
,rust
它返回一个字符串,并希望更新它以选择性地返回一个向量。
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)