参考 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函数里又不对了。。后面这个没搞懂,有点懵