【发布时间】:2021-10-06 21:56:45
【问题描述】:
我想返回一个对集合中的拥有对象的引用(即Vec),但我似乎无法正确获取生命周期。这是我第一次尝试的:
struct StringHolder {
strings: Vec<String>,
i: usize,
}
impl Iterator for StringHolder {
type Item<'a> = &'a String;
fn next(&mut self) -> Option<Self::Item> {
if self.i >= self.strings.len() {
None
} else {
self.i += 1;
Some(&self.strings[self.i])
}
}
}
fn main() {
let sh = StringHolder { strings: vec![], i: 0 };
for string in sh {
println!("{}", string);
}
}
我收到 generic associated types are unstable 和 lifetimes do not match type in trait 的错误。我尝试了其他一些迭代,但似乎没有任何效果。
根据我读过的一些内容,我认为这可能是不可能的,但我似乎无法弄清楚Vec 是如何做到这一点的。例如,我可以使用以下代码简单地遍历底层 Vec 并在每次迭代时返回一个引用:
struct StringHolder {
strings: Vec<String>,
}
impl<'a> IntoIterator for &'a StringHolder {
type Item = &'a String;
type IntoIter = ::std::slice::Iter<'a, String>;
fn into_iter(self) -> Self::IntoIter {
(&self.strings).into_iter()
}
}
fn main() {
let sh = StringHolder { strings: vec!["A".to_owned(), "B".to_owned()] };
for string in &sh {
println!("{}", string);
}
}
所以这让我觉得这是可能的,我只是还没有弄清楚生命周期。感谢您的帮助。
【问题讨论】:
-
Iterator不允许其Items 的生命周期随self的生命周期而变化,但在您的情况下,这些项目 存储 在迭代器并共享它的生命周期,所以这是行不通的。Vec与您尝试做的事情完全不同。迭代器应该与容器分开。