在不深度复制其元素的情况下分支迭代器
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);
}
clone
克隆迭代器本身。同时 cloned
从 documentation:
克隆底层元素
Cloned: An iterator that clones the elements of an underlying iterator.
迭代器由 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);
}
clone
克隆迭代器本身。同时 cloned
从 documentation:
Cloned: An iterator that clones the elements of an underlying iterator.