< 返回版块

chloro-pn 发表于 2021-03-24 17:27

为自定义的VectorIter实现Iterator的trait,下面的代码是正确的么,如果是正确的,Iterator中的'a到底约束了什么,如果不是正确的那应该怎么写? 我尝试为self加上'a生命周期约束,但是rust提示我:

expected fn pointer `fn(&mut VectorIter<'a, T>) -> Option<_>`
   found fn pointer `fn(&'a mut VectorIter<'a, T>) -> Option<_>`rustcE0308

看样子是否标记生命周期对于实现trait方法而言是不一样的函数。

pub struct VectorIter<'a, T> {
    index : i64,
    holder : &'a Vector<T>,
}

impl<'a, T> Iterator for VectorIter<'a, T> {
    type Item = &'a T;
    fn next(self : &mut Self) -> Option<Self::Item> {
        if self.index as usize == self.holder.container.len() {
            None
        } else {
            let v = &self.holder.container[self.index as usize];
            self.index += 1;
            Some(v)
        }
    }
}

评论区

写评论
作者 chloro-pn 2021-03-25 10:30

基本上明白了,感谢🤝

--
👇
ywxt: 并不是

fn next(self : &mut Self) -> Option<Self::Item>

等价于

fn next<'b>(self : &'b mut Self) -> Option<Self::Item>

这儿'a:'b

你可以尝试以下代码,帮助理解。

struct S<'a>{
    //...
}

impl<'a> S<'a>{
    fn aa<'b>(&'b mut self) {}
    fn bb(&'a mut self) {}
}

let s1 = ...;
s1.aa();//ok
s1.aa();//ok
let s2 = ...;
s2.bb();//ok
s2.bb();//error

查看解释

ywxt 2021-03-25 02:29

并不是

fn next(self : &mut Self) -> Option<Self::Item>

等价于

fn next<'b>(self : &'b mut Self) -> Option<Self::Item>

这儿'a:'b

你可以尝试以下代码,帮助理解。

struct S<'a>{
    //...
}

impl<'a> S<'a>{
    fn aa<'b>(&'b mut self) {}
    fn bb(&'a mut self) {}
}

let s1 = ...;
s1.aa();//ok
s1.aa();//ok
let s2 = ...;
s2.bb();//ok
s2.bb();//error

查看解释

作者 chloro-pn 2021-03-24 22:02

那么这里的self是不是隐式的被标记了‘a,而且由于trait的限制不能显式加上

--
👇
ywxt:

pub struct VectorIter<'a, T> {
    index: i64,
    holder: &'a Vec<T>,
}

VectorIter'a内有效。

impl<'a, T> 这儿的'aTVectorIter'a 、T是相同的.

type Item = &'a T 意为 Item满足'a,并且T也满足.

'a约束了每次next返回一个元素的时候,VectorIter应该是有效的(holder当然也是).

作者 chloro-pn 2021-03-24 21:56

多谢,我去看看

--
👇
munpf: 虽然我也算是新手,解释不清楚,不过你可以参考一下这篇文章:https://zhuanlan.zhihu.com/p/165976086,应该有帮助

ywxt 2021-03-24 19:09
pub struct VectorIter<'a, T> {
    index: i64,
    holder: &'a Vec<T>,
}

VectorIter'a内有效。

impl<'a, T> 这儿的'aTVectorIter'a 、T是相同的.

type Item = &'a T 意为 Item满足'a,并且T也满足.

'a约束了每次next返回一个元素的时候,VectorIter应该是有效的(holder当然也是).

munpf 2021-03-24 17:57

虽然我也算是新手,解释不清楚,不过你可以参考一下这篇文章:https://zhuanlan.zhihu.com/p/165976086,应该有帮助

1 共 6 条评论, 1 页