You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中单次迭代合并元组序列中的嵌套序列?

Rust中单次迭代拼接元组序列的对应元素

你可以使用迭代器的fold方法,在单次遍历中完成两个Vec的拼接,同时避免多次迭代的开销。

方案1:转移原数据所有权(高效)

如果不需要保留原data的所有权,可以直接用into_iter转移元素所有权,避免克隆操作:

fn main() {
    let data = [
        (vec![1, 2, 3], vec!['a']), 
        (vec![4, 5, 6], vec!['b', 'c'])
    ];
    
    let res: (Vec<i32>, Vec<char>) = data.into_iter().fold(
        (Vec::new(), Vec::new()),
        |(mut nums, mut chars), (num_vec, char_vec)| {
            nums.extend(num_vec);
            chars.extend(char_vec);
            (nums, chars)
        }
    );
    
    assert_eq!(res.0, vec![1, 2, 3, 4, 5, 6]);
    assert_eq!(res.1, vec!['a', 'b', 'c']);
}

方案2:保留原数据所有权

如果需要继续使用原data,可以用iter遍历引用,再通过cloned复制元素:

fn main() {
    let data = [
        (vec![1, 2, 3], vec!['a']), 
        (vec![4, 5, 6], vec!['b', 'c'])
    ];
    
    let res: (Vec<i32>, Vec<char>) = data.iter().fold(
        (Vec::new(), Vec::new()),
        |(mut nums, mut chars), (num_vec, char_vec)| {
            nums.extend(num_vec.iter().cloned());
            chars.extend(char_vec.iter().cloned());
            (nums, chars)
        }
    );
    
    // 原data仍可正常访问
    assert_eq!(data[0].0, vec![1, 2, 3]);
    assert_eq!(res.0, vec![1, 2, 3, 4, 5, 6]);
    assert_eq!(res.1, vec!['a', 'b', 'c']);
}

核心思路

fold方法允许你在单次迭代中维护多个累积状态(这里是两个空Vec),每次遍历元组时,将对应位置的序列扩展到累积Vec中,最终返回拼接完成的元组,完全符合需求。

内容的提问来源于stack exchange,提问作者qoqosz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:12:41