约束父特征以引用

时间:2016-09-02 14:34:10

标签: iterator rust traits

我想定义一个特征Container,这样这个特征的每个实现者也需要实现IntoIterator,但需要注意的是迭代总是只能借用实例。如果我理解正确,我可以使用这样的模式实现IntoIterator

impl<'a> IntoIterator for &'a ContainerImpl

但是,如果类型实现Container,我该如何指定这需要实现,例如:

trait Container: &IntoIter ???

1 个答案:

答案 0 :(得分:6)

您也可以为特征添加where子句(playground):

trait IterBorrow where for<'a> &'a Self: IntoIterator {}
impl IterBorrow for [i32] {} // legal
// impl IterBorrow for i32 {} // Illegal

但是,您似乎需要在实际想要迭代时重复此绑定,即,如果没有where子句,此函数不会编译:

fn foo<T: IterBorrow>(x: T) where for<'a> &'a T: IntoIterator {
    for _ in &x {}
    for _ in &x {}
}