< 返回版块

chloro-pn 发表于 2021-03-26 15:51

有一个trait如下:

pub trait MatrixIterator<T : Iterator> {
    fn get_iterator(self : &Self, row : &i64) -> T;
}

我要为类型SparseMatrix实现该trait:

impl<T> MatrixIterator<RowIterator<'a, T>> for SparseMatrix<T> {
    fn get_iterator(self : &Self, row : &i64) -> RowIterator<'a, T> {
        RowIterator::new(*row, &self.container[*row as usize].1)
    }
}

其中RowIterator已经实现了Iterator,其带有一个生命周期标记,但是我的SparseMatrix并不含有 生命周期标记,这个时候如何指定'a呢?

评论区

写评论
作者 chloro-pn 2021-03-27 11:50

非常感谢,rust的这种设计,生命周期标记和trait绑定的这么紧密,是不是会限制语言的抽象能力呀,如果我要为RowIterator实现标准库的Iterator岂不是做不到·。·

--
👇
nujz: 改 SparseMatrix 好像不行

nujz 2021-03-26 21:20

改 SparseMatrix 好像不行

nujz 2021-03-26 20:37
pub trait MatrixIterator<'a, T: 'a> {
    fn get_iterator<'b: 'a>(self: &'b Self, row: &'b i64) -> T;
}

struct SparseMatrix<T>(T);

struct RowIterator<'a, T>(&'a T);

impl<'a, T> MatrixIterator<'a, RowIterator<'a, T>> for SparseMatrix<T> {
    fn get_iterator<'b: 'a>(self: &'b Self, row: &'b i64) -> RowIterator<'a, T> {
        RowIterator(&self.0)
    }
}
作者 chloro-pn 2021-03-26 20:16

你好,我刚学rust不久,只见过在拥有引用类型成员的struct上如何标注生命周期,我的SparseMatrix不含有引用类型,该怎么标记呢。或者这里的MatrixIterator怎么修改,感谢。

--
👇
nujz: ```rust fn get_iterator(self : &Self, row : &i64) -> RowIterator<'a, T>

编译器没法判断返回值 RowIterator<'a, T> 的生命周期跟 self 或 row 的关系,得在 MatrixIterator 或 SparseMatrix 上面加 'a 才行
nujz 2021-03-26 19:41
fn get_iterator(self : &Self, row : &i64) -> RowIterator<'a, T>

编译器没法判断返回值 RowIterator<'a, T> 的生命周期跟 self 或 row 的关系,得在 MatrixIterator 或 SparseMatrix 上面加 'a 才行

1 共 5 条评论, 1 页