我有一个Rust函数,它接受两个参数并返回一个Result。它的定义如下:
fn calculate_density(a: String, with_correction: bool) -> Result<u64, String>;
问题是我想修改我的方法签名,使成功结果的返回类型取决于参数with_correction
。
例如idwith_correction
设置为true,我发送回u64。如果是false,我想发送一个String
我试图用一个元组来做到这一点,其中成功的结果是一个选项元组,它们在运行时根据with_correction
fn calculate_density(a: String, with_correction: bool) -> Result<(Option<u64>, Option<String>), String>;
但这似乎有点过头了。有更好的方法来实现这一点吗?
如果您的输出依赖于单个bool
输入,您应该考虑的第一件事是将其拆分为2个函数:
fn calculate_density(a: String) -> Result<String, String> {
// do stuff
}
fn calculate_density_with_correction(a: String) -> Result<u64, String> {
calculate_density(a).map(|density| density.parse::<u64>().unwrap_or_default())
}
如果你真的真的想要有多个不同类型的输出,可以使用这样的enum:
enum Output {
WithCorrection(u64),
WithoutCorrection(String),
}
fn calculate_density(a: String, with_correction: bool) -> Result<Output, String> {
// …
let uncorrected = String::from("uncorrected_value");
if with_correction {
let corrected = correct(uncorrected);
Ok(Output::WithCorrection(corrected))
} else {
Ok(Output::WithoutCorrection(uncorrected))
}
}
或者如果你不想写一个自定义的enum
使用Either
:
use either::Either;
fn calculate_density(a: String, with_correction: bool) -> Result<Either<u64, String>, String> {
// …
let uncorrected = String::from("uncorrected_value");
if with_correction {
let corrected = correct(uncorrected);
Ok(Either::Left(corrected))
} else {
Ok(Either::Right(uncorrected))
}
}