首先,我对 Rust 没有太多经验,所以我可能误解了一些观点。我正在尝试创建一个对象(结构)来迭代迭代器中元素的组合。我需要在结构中存储迭代器元素的引用,但我无法弄清楚如何做到这一点。这是我的代码:
pub struct Combination<'a, T: Iterator> {
_obj_items_: Vec<&'a T::Item>,
_com_: Vec<usize>,
}
impl<'a, T: Iterator> Combination<'a, T> {
pub fn new (_obj_: &'a mut T, many: usize) -> Combination<'a, T> {
let mut r = Combination::<'a, T> {
_obj_items_ : Vec::<&'a T::Item>::with_capacity(_obj_.by_ref().count()),
_com_ : Vec::<usize>::with_capacity(many),
};
r._com_.append(&mut (0..many).collect());
/* filling vector with _obj_ elements. */
for e in _obj_.by_ref() {
r._obj_items_.push(&e);
}
r
}
}
我的想法是,当我制作
_obj_.by_ref()
(在注释下方的循环中)时,它将迭代迭代器的元素,但我认为它正在迭代包含元素的迭代器的项目。我对吗?如何使我的代码正确存储实际元素的引用?
调用
_obj_.by_ref()
会创建对原始迭代器的新引用,但不会消耗迭代器的元素。它允许您可变地借用迭代器并在多个地方使用它而无需消耗。
您的问题是尝试将迭代器项的引用存储在向量中,一旦迭代器被消耗或修改,这些引用就会失效,因为迭代器可能会在迭代期间移动其内部状态或修改其元素。
您应该存储项目本身,您可以通过将项目收集到向量中来做到这一点。
pub struct Combination<T: Iterator> {
_obj_items_: Vec<T::Item>,
_com_: Vec<usize>,
}
impl<T: Iterator> Combination<T> {
pub fn new(_obj_: T, many: usize) -> Combination<T> {
let mut r = Combination {
_obj_items_: _obj_.collect(),
_com_: (0..many).collect(),
};
r
}
}