对于引用的元组,`ParallelExtend`
作者: xosmig创建于 2023年9月6日更新于 2026年8月10日
ParallelExtend 实现了元组,允许从一个 ParallelIterator 扩展多个集合,这非常有用。以下代码按预期工作:
let vec1 = vec![1., 2., 3.];
let vec2 = vec!["1".to_string(), "2".to_string(), "3".to_string()];
let input = vec![4, 5, 6];
let mut vecs = (vec1, vec2);
vecs.par_extend(input.into_par_iter().map(|i| (i as f64, i.to_string())));
assert_eq!(&vecs.0, &vec![1., 2., 3., 4., 5., 6.]);
assert_eq!(&vecs.1, &vec!["1", "2", "3", "4", "5", "6"]);
但是,目前实现的方式是,两个集合实际上必须存储为一个元组。以下代码无法编译:
```Rust
let mut vec1 = vec![1., 2., 3.];
let mut vec2 = vec!["1".to_string(), "2".to_string(), "3".to_string()];
let input = vec![4, 5, 6];
// 错误: 方法未在 `(&mut Vec<{float}>, &mut Vec<String>)` 中找到
(&mut vec1, &mut vec2).par_extend(input.into_par_iter().map(|i| (i as f64, i.to_string())));
assert_eq!(&vec1, &vec![1., 2., 3., 4., 5., 6.]);
assert_eq!(&vec2, &vec!["1", "2", "3", "4", "5", "6"]);
这看起来是一个自然的用例,我在使用 `rayon` 时至少遇到过几次。我是否错过了实现我想要的其他工具?如果不是,是否有可能添加对它的支持?也许可以使用稍微不同的 API,因为实现 `ParallelExtend` 适用于 `(&mut FromA, &mut FromB)` 可能会与原始实现适用于 `(FromA, FromB)` 发生冲突。内容来源: rayon-rs/rayon