在不深度复制其元素的情况下分支迭代器

Branching a iterator without deep copying its elements

迭代器由 map 消耗,因此在多次映射迭代器时需要 cloned(等于 clone?)。我有以下代码:

fn main() {
    let a: Vec<(&str, (&i32, &i32))> = vec![("0", (&0, &1)), ("1", (&2, &3))];
    let iter = a.iter().map(|x| x.1 as (&i32, &i32));

    // occur clone process on i32?
    let xs: Vec<&i32> = iter.cloned().map(|(x, _)| x).collect();
    
    let ys: Vec<&i32> = iter.map(|(_, y)| y).collect();
    println!("{:?}", xs);
    println!("{:?}", ys);
}

问题是 cloned 方法可能深度复制整个迭代元素,即使元素包含不可变引用。克隆的元素是上面的 i32,但它实际上可能有大结构。当分支迭代器 iter 时,我想显式浅复制包含对 i32(实际上更大的结构)引用的元素。可能吗?

使用clone代替cloned:

fn main() {
    let a: Vec<(&str, (&i32, &i32))> = vec![("0", (&0, &1)), ("1", (&2, &3))];
    let iter = a.iter().map(|x| x.1 as (&i32, &i32));

    // occur clone process on i32?
    let xs: Vec<&i32> = iter.clone().map(|(x, _)| x).collect();
    
    let ys: Vec<&i32> = iter.map(|(_, y)| y).collect();
    println!("{:?}", xs);
    println!("{:?}", ys);
}

Playground

clone 克隆迭代器本身。同时 cloneddocumentation:

克隆底层元素

Cloned: An iterator that clones the elements of an underlying iterator.