调用iter()。sum()时出错:特质绑定`f64:std :: iter :: Sum <&std :: vec :: Vec <f64 >>`

时间:2020-05-14 17:19:40

标签: rust rayon

我正在为应该返回f64Error的函数而苦苦挣扎。我尝试了很多组合,但没有成功。

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>

Playground

1 个答案:

答案 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

现在可以使用了!