参考 https://rust-lang.github.io/generic-associated-types-initiative/explainer/iterable.html
实现了 iterable, 在 iterable 基础上,有一个trait 返回 一个 iterable 对象就编译不过去了。
Ext Link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=7bd77f0b0d655f24b31d131065431d79
1
共 2 条评论, 1 页
评论区
写评论这个trait的定义有问题
假设你对Foo定义了TestTrait,然后你执行
首先,
let a=Foo::new().collection();
请求了一个生命周期为'c
的借用然后,后面的
let c=b.collection();
同样请求了一个生命周期为'c
的借用现在,我们
drop
掉一个借用。正常观点是,
b
的不可变借用已经被drop
了,所以接下来我们可以放心地修改b
的取值然而还有另一个观点:对
b
的借用需要持续'c
这么久,而目前'c
还没有结束(因为a的借用生命周期也是同样的'c
)于是现在不能修改
b
——如此看,你对
TestTrait
的定义其实是不合理的。你或许应该转而定义TestTrait<'c>
才对TestTrait::Collection
的生命周期标注'i
和'c
是两个不同的生命周期,并且没有关联约束,所以impl里会报错。 但是我改了一下后,traverse
函数里又不对了。。后面这个没搞懂,有点懵