0

我有一个结构向量。它被称为更新,我想通过减少结构来减少这个向量以获得最大波速。我试图减少使用人造丝库中的 par_iter() 。由于身份 (id) 和运算符 (op) 函数的输入和输出类型不同,我的代码无法编译。有没有办法让迭代器只看到 max_wavespeed 字段,还是我必须返回一个包含降低的波速的更新结构?

#[derive(Clone, Copy)]
pub struct Updates {
    pub h_update_left: f32,
    pub h_update_right: f32,
    pub hu_update_left: f32,
    pub hu_update_right: f32,
    pub max_wavespeed: f32,
}

...

let mut updates: Vec<Updates> = vec![Updates::new(); outer * inner];

...

//get max wavespeed
let id = || -> f32 { 0.0f32 };
let op = |upd1: Updates, upd2: Updates| -> f32 {
   f32::max(upd1.max_wavespeed, upd2.max_wavespeed)
};
let max_wavespeed: f32 = updates.par_iter().cloned().reduce(id, op);

我对这段代码的错误:

error[E0308]: mismatched types
  --> src/block.rs:95:34
   |
95 |         let max_wavespeed: f32 = updates.par_iter().cloned().reduce(id, op);
   |                            ---   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `f32`, found struct `Updates`
   |                            |
   |                            expected due to this

我想要的是:知道我是否可以遍历 Updates 结构的成员,还是必须返回 Upates 结构。

4

1 回答 1

2
 let id = || -> f32 { 0.0f32 };
 let op = |upd1: f32, upd2: f32| -> f32 { f32::max(upd1, upd2) };       

 let max_wavespeed_x: f32 = updates
            .par_iter()
            .cloned()
            .map(|updates| updates.max_wavespeed)
            .reduce(id, op);

此代码会产生所需的行为。

于 2021-04-11T23:31:03.673 回答