私はGrid
このような構造体を持っています:
pub struct Grid<Item : Copy> {
raw : Vec<Vec<Item>>
}
私はその上にさまざまな種類のイテレータを書き直そうとしています (主に演習として、ここで提示された特定の問題を解決するための「より良い」方法がある場合でも、これを行いたいと思います)。
行の反復は簡単でした。フィールドは単なる行のベクトルであるraw
ため、毎回後続の各行への参照を生成できます。
しかし、列を反復処理するのに苦労しています。への呼び出しごとに新しい Vec を作成しようとしましたnext()
が、参照が十分に長く存続しません。これは理にかなっています。以下のコードは、一時的な vec への参照を iterator 構造体に格納して、有効期間を継承しようとする試みです。しかし、それもうまくいきません:
pub struct ColIter<'a, T>
where T : 'a + Copy + Debug + Display + FromStr
{
grid : &'a Grid<T>,
index : usize,
col_temp : Vec<T>,
}
impl <'a,T> ColIter<'a,T>
where T : 'a + Copy + Debug + Display + FromStr
{
fn new( grid : &'a Grid<T> ) -> ColIter<'a,T> {
ColIter {
grid : grid,
index : 0,
col_temp : Vec::with_capacity(grid.width()),
}
}
}
impl <'a,T> Iterator for ColIter<'a,T>
where T : Copy + Debug + Display + FromStr
{
type Item = &'a Vec<T>;
fn next(&mut self) -> Option<Self::Item> {
if self.index < self.grid.height() {
for row in 0..self.grid.width() {
self.col_temp[row] = self.grid.raw[row][self.index];
}
self.index += 1;
Some( & self.col_temp ) // <-- ERROR HERE
}
else {
None
}
}
}
エラーが発生します:
src/grid.rs:253:19: 253:34 error: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
src/grid.rs:253 Some( & self.col_temp )
^~~~~~~~~~~~~~~
src/grid.rs:247:5: 258:6 help: consider using an explicit lifetime parameter as shown: fn next(&'a mut self) -> Option<Self::Item>
提案が特性と互換性がないため、「ヘルプ」行は役に立ちません。