gpt4 book ai didi

error-handling - 如何将 fold 与 Result 返回值一起使用?

转载 作者:行者123 更新时间:2023-11-29 08:10:34 25 4
gpt4 key购买 nike

我有一个函数:

fn test<T: FromStr>(text: &str) -> Result<T, SaleError>

SaleError 是我在这种情况下的自定义错误结构。

我有 2 个数组,我想将相同的位置值相乘并对结果求和:

fn calculate_result() -> Result<f64, SaleError> {
let q_coms = ["1", "2", "3"];
let v_un_coms = ["1", "2", "3"];
Ok(try!(q_coms.iter().zip(v_un_coms.iter()).fold(0.0, mult_and_sum)))
}

该函数尝试压缩两个数组,然后尝试在 mult_and_sum 函数上调用 fold:

fn mult_and_sum(sum: f64, (q_com, v_un_com): (&str, &str)) -> Result<f64, SaleError> {
Ok(sum + try!(test::<f64>(q_com)) * try!(test::<f64>(v_un_com)))
}

据我所知,问题是 fold 需要一个带有签名的函数

fn mult_and_sum(sum: f64, (q_com, v_un_com): (&str, &str)) -> f64

由于 test 函数可能会失败,我如何将 foldResult 返回值一起使用,所以如果失败,calculate_result 将返回 Err(SaleError)?

最佳答案

无需猜测,错误消息会告诉您。我重新组织了它以使其更明显:

actual:   for<'r, 'r> std::ops::FnMut<(f64, (&'r str, &'r str))>
required: std::ops::FnMut<({float}, (&&str, &&str))>

它还说 (expected &str, found str)。这是因为您有一段字符串切片 (&[&str])。切片的迭代器返回对每个元素的引用,因此该值的类型为 &&str。该函数接受 &str,因此这是不匹配的。

另一方面,documentation for fold显示它所期望的:

fn fold<B, F>(self, init: B, f: F) -> B 
where F: FnMut(B, Self::Item) -> B

简而言之:fold 按值获取迭代器 (self)、某种类型的初始值 (init: B),以及函数 (f: F)。该函数采用该类型(迭代器值)并返回类型 (FnMut(B, Self::Item) -> B)。

反过来,你想返回一个 Result,所以 B 必须固定为那个。这意味着你的累加器必须是一个 Result,大概你想要一个 Ok,否则我们从一开始就失败了。让我们直接实现它:

fn calculate_result() -> Result<f64, SaleError> {
let q_coms = ["1", "2", "3"];
let v_un_coms = ["1", "2", "3"];
let pairs = q_coms.iter().zip(v_un_coms.iter());
pairs.fold(Ok(0.0), |acc, (a, b)| {
match acc {
Ok(old) => mult_and_sum(old, (a, b)),
other => other,
}
})
}

可以用 and_then 简化

pairs.fold(Ok(0.0), |acc, (a, b)| 
acc.and_then(|old| mult_and_sum(old, (a, b)))
)

然后可能变小一点:

let pairs = q_coms.iter().cloned().zip(v_un_coms.iter().cloned());
pairs.fold(Ok(0.0), |acc, i| acc.and_then(|old| mult_and_sum(old, i)))

我们使用 cloned&&str 转换为 &str,但您也可以更改函数以接受 &&str

关于error-handling - 如何将 fold 与 Result 返回值一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41569472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com