如何借用.iter()返回的索引。在rust中使用更长的生命周期枚举
假设我有一个包含Vec的网格,我想要一个返回迭代器的函数,迭代器包含位置和值,比如(0,0100),(0,1200) 所以我写了以下代码:如何借用.iter()返回的索引。在rust中使用更长的生命周期枚举,rust,lifetime,Rust,Lifetime,假设我有一个包含Vec的网格,我想要一个返回迭代器的函数,迭代器包含位置和值,比如(0,0100),(0,1200) 所以我写了以下代码: pub struct Grid<T> where T: Clone, { values: Vec<Vec<T>>, } #[derive(Debug)] pub struct GridItem<T> where T: Clone, { pub val: T, pub x
pub struct Grid<T>
where
T: Clone,
{
values: Vec<Vec<T>>,
}
#[derive(Debug)]
pub struct GridItem<T>
where
T: Clone,
{
pub val: T,
pub x: usize,
pub y: usize,
}
impl<T> Grid<T>
where
T: Clone,
{
pub fn get_items<'a>(&'a self) -> impl Iterator<Item = GridItem<T>> + 'a {
let mut it: Box<dyn Iterator<Item = GridItem<T>> + 'a> = Box::new(std::iter::empty());
for (i, l) in self.values.iter().enumerate() {
let ii = l
.iter()
.enumerate()
.map(|(j, x)| GridItem {
val: x.clone(),
x: j,
y: i, // y: 0 compiles
})
.into_iter();
it = Box::new(it.chain(ii));
}
it
}
}
pub结构网格
哪里
T:克隆,
{
价值观:Vec,
}
#[导出(调试)]
发布结构GridItem
哪里
T:克隆,
{
酒吧:T,
酒吧x:使用,
酒吧y:使用,
}
impl网格
哪里
T:克隆,
{
pub fn get_items impl迭代器+'a{
让我们mut它:Box(&'a self)->impl迭代器+'a{
|--此处定义的生存期“a”
43 | let mut it:Box问题是闭包|(j,x)| GridItem…
仅包含对i
的引用,该引用将在调用闭包之前退出范围。您可以通过将i
移动到闭包中来解决此问题:
.map(move |(j, x)| GridItem { ...
// ^^^^
<> >而不是通过<代码>迭代地建立迭代器.Cu链,考虑使用:
pub fn get_items impl迭代器+'a{
self.values.iter().enumerate().flat|u映射(|(i,vec)|{
vec.iter().enumerate().map(move |(j,val)| GridItem{
val:val.clone(),
x:j,
y:我,
})
})
}
.map(move |(j, x)| GridItem { ...
// ^^^^
pub fn get_items<'a>(&'a self) -> impl Iterator<Item = GridItem<T>> + 'a {
self.values.iter().enumerate().flat_map(|(i, vec)| {
vec.iter().enumerate().map(move |(j, val)| GridItem {
val: val.clone(),
x: j,
y: i,
})
})
}