我正在为应该返回f64
或Error
的函数而苦苦挣扎。我尝试了很多组合,但没有成功。
fn_rayon_parallel(&self) -> Result<f64, Box<dyn Error + Send + Sync>> {
let all_payoffs = (0..10000).into_par_iter().map(
|_| { //things could go very wrong here
match self.get_one_payoff() {
Ok(payoff) => {Ok(payoff)},
Err(e) => Err(e)
}
}
).collect::<Result<Vec<_>, _>>();
//this is the part I am struggling with, does not compile
//I need to return either f64 or Error
match all_payoffs {
Ok(_v) => Ok(2.34 * (1.0/10000.0) * (all_payoffs.iter().sum::<f64>())),
Err(e) => Err(From::from("There was an error in calculating Discounted Payoffs."))
}
}
错误:
error[E0277]: the trait bound `f64: std::iter::Sum<&std::vec::Vec<f64>>` is not satisfied
--> src/main.rs:81:69
|
81 | Ok(_v) => Ok(2.34 * (1.0/10000.0) * (all_payoffs.iter().sum::<f64>())),
| ^^^ the trait `std::iter::Sum<&std::vec::Vec<f64>>` is not implemented for `f64`
|
= help: the following implementations were found:
<f64 as std::iter::Sum<&'a f64>>
<f64 as std::iter::Sum>
答案 0 :(得分:3)
您的主要问题就在这里(简化了一下):
match all_payoffs {
Ok(_v) => Ok(1.0 * (all_payoffs.iter().sum::<f64>())),
Err(e) => { /*...*/ }
}
请注意,您的all_payoffs
变量的类型为Result<Vec<f64>, Box<dyn Error + Send>>
。因此,当您执行.iter()
时,您会认为您正在获取类型为&f64
的向量值的迭代器,但实际上却是{{1}中的iterator for the ok-value } !!
在许多情况下这很方便,例如,如果Result
,您可以使用Iterator::flatten()
对所有值求和,如果Ok()
,则返回0.0
:
Err()
但是在这里,编译器认为您正在尝试对向量求和并且无法完成,因此会出现错误消息:
约束
let x = all_payoffs.iter().flatten().sum::<f64>();
的特征不满足
这基本上意味着:您不能求和一堆f64: std::iter::Sum<&std::vec::Vec<f64>>
并得到&Vec<f64>
。
解决方案就在眼前,使用f64
:
_v
现在可以使用了!