1

データのグリッドを表す構造体と、行と列のアクセサーがあります。Vec の代わりにイテレータを返す行と列のアクセサを追加しようとしています。

use std::slice::Iter;

#[derive(Debug)]
pub struct Grid<Item : Copy> {
    raw : Vec<Vec<Item>>
}

impl <Item : Copy> Grid <Item>
{
    pub fn new( data: Vec<Vec<Item>> ) -> Grid<Item> {
        Grid{ raw : data }
    }
    pub fn width( &self ) -> usize {
        self.rows()[0].len()
    }
    pub fn height( &self ) -> usize {
        self.rows().len()
    }
    pub fn rows( &self ) -> Vec<Vec<Item>> {
        self.raw.to_owned()
    }
    pub fn cols( &self ) -> Vec<Vec<Item>> {
        let mut cols = Vec::new();
        for i in 0..self.height() {
            let col = self.rows().iter()
                        .map( |row| row[i] )
                        .collect::<Vec<Item>>();
            cols.push(col);
        }
        cols
    }

    pub fn rows_iter( &self ) -> Iter<Vec<Item>> {
        // LIFETIME ERROR HERE
        self.rows().iter()
    }

    pub fn cols_iter( &self ) -> Iter<Vec<Item>> {
        // LIFETIME ERROR HERE
        self.cols().iter()
    }
}

関数rows_iterとの両方cols_iterに同じ問題があります: error: borrowed value does not live long enough. 私は多くのことを試しましたが、ここに投稿する最も単純なものに戻しました。

4

2 に答える 2

2

into_iterを返すメソッドを使用できますstd::vec::IntoIter。この関数iterは通常、反復処理されたデータ ソースのみを借用します。into_iterデータソースの所有権を持っています。したがって、ベクトルは実際のデータが存続する限り存続します。

pub fn cols_iter( &self ) -> std::vec::IntoIter<Vec<Item>> {
    self.cols().intoiter()
}

ただし、Grid タイプのデザインは大幅に改善できると思います。常にベクターのクローンを作成することは良いことではありません (1 つの問題を挙げると)。

于 2015-11-30T07:10:37.390 に答える