Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何借用.iter()返回的索引。在rust中使用更长的生命周期枚举_Rust_Lifetime - Fatal编程技术网

如何借用.iter()返回的索引。在rust中使用更长的生命周期枚举

如何借用.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

假设我有一个包含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: 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,
        })
    })
}