tau*_*bem 5 traits lifetime rust
我有一个特征,我想要求实现类型可以通过借用进行迭代。我已经成功地for<'x>
在&'x Self
.
但是,我也想要求IntoIter
关联的类型实现ExactSizeIterator
,但我尝试在类型系统中描述这一点的每种方式都会导致编译问题,这些问题似乎源于 HRTB 的使用(我不完全相信我正确使用了 HRTB) )。
这是(简化的)代码:
struct Thing<'thing>(&'thing ());
trait Trait<'thing>
where
for<'x> &'x Self: IntoIterator<Item = &'x Thing<'thing>>,
// Compiles fine until uncommenting this line:
//for<'x> <&'x Self as IntoIterator>::IntoIter: ExactSizeIterator
{ }
struct Bucket<'things> {
things: Vec<Thing<'things>>,
}
struct BucketRef<'a, 'things: 'a> {
bucket: &'a Bucket<'things>,
}
impl<'x, 'a, 'things: 'a> IntoIterator for &'x BucketRef<'a, 'things> {
type Item = &'x Thing<'things>;
type IntoIter = std::slice::Iter<'x, Thing<'things>>;
fn into_iter(self) -> Self::IntoIter {
self.bucket.things.iter()
}
}
impl<'a, 'things: 'a> Trait<'things> for BucketRef<'a, 'things> { }
fn foo<'a, 'things>(anchor: &BucketRef<'a, 'things>) {
println!("{}", ExactSizeIterator::len(&anchor.into_iter()));
}
Run Code Online (Sandbox Code Playgroud)
正如所写,这编译得很好,但是当我尝试通过注释行进一步限制边界时Trait
,我收到以下编译器错误:
error[E0277]: the trait bound `for<'x> <&'x anchor::BucketRef<'a, 'things> as std::iter::IntoIterator>::IntoIter: std::iter::ExactSizeIterator` is not satisfied
Run Code Online (Sandbox Code Playgroud)
在我的非编译器编写者看来,给定rustc
似乎能够在函数内部确定sfoo
的所有实例,它应该能够对特征界限执行类似的操作,但这在现实中并未得到证实。&BucketRef
ExactSizeIterator
谁能向我解释为什么这不起作用,以及是否有更好的方法来表达界限本身或界限背后的意图?
active toolchain
----------------
stable-x86_64-unknown-linux-gnu (default)
rustc 1.43.0 (4fb7144ed 2020-04-20)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
597 次 |
最近记录: |