来自同一函数签名的多个返回类型

  • 本文关键字:返回类型 函数 rust
  • 更新时间 :
  • 英文 :


我有一个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))
}
}

最新更新