如何在Rust中传递一个带有交互器的结构体示例沿着以进行Map

atmip9wb  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(96)

我想重写一个Vec<T>,但也要给我的函数传递一个struct示例。
这个想法是,我可以在每个进程中单独复制结构体示例,并根据存储在Vec<T>中的初始条件修改每个复制的结构体示例。
同样,我有一组存储在Vec中的初始条件,我想使用.iter()迭代地修改一组结构示例副本。
我天真的猜测是,我必须创建一个额外的Vec<StructType>,其长度与Vec<T>相同,然后在该Vec<StructType>,中的struct示例内创建许多副本,但我想知道是否有更有效的方法,每个进程都可以创建副本。
下面是我尝试做的事情的概述,尽管我不确定将struct_instance传递给我的函数的最佳方式是什么。

// --- PreProcessing ---
let struct_instance <StructType> = read_inputs(json);

// --- Iteration ---
let initial_conditions: Vec<i32> = (1..5).collect();
let test: Vec<i32> = initial_conditions
    .iter()
    .map(calculation_function)
    .collect();

字符串
我在代码片段中省略了read_inputscalculation_function的定义,因为我觉得完整的定义可能会偏离问题的要点。
稍后我想用rayon并行化这个任务,这就是为什么我选择使用.iter()方法的原因。

yhxst69z

yhxst69z1#

iter::repeat(SomeStruct { .. })将给予一个迭代器,重复初始结构定义。
initial_condition.iter().zip(iter::repeat(SomeStruct { .. })将给予一个迭代器,该迭代器为initial_condition集合中包含的每个值提供一个元组(initial_condition, some_struct)
一个完整的例子如下所示:我将测试类型从i32改为SomeStruct,因为你似乎想收集初始结构的修改版本,但我可能误解了你的要求。

use std::iter;

#[derive(Clone, Debug)]
struct SomeStruct {
    value: i32,
}

fn main() {
    let structs = iter::repeat(SomeStruct { value: 0 });

    let initial_conditions: Vec<i32> = (1..5).collect();
    let test: Vec<SomeStruct> = initial_conditions
        .iter()
        .zip(structs)
        .map(|(initial_condition, mut somestruct)| {
            somestruct.value = *initial_condition;
            somestruct
        })
        .collect();

}

字符串

相关问题