【问题标题】:Lifetime and associated types生命周期和相关类型
【发布时间】:2023-02-10 21:29:11
【问题描述】:

我有这个枚举:

enum Node<T> {
    Leaf(T),
    Children(Vec<Node<T>>),
}

并希望为 Node 实现 Iterator 特征。 我创建了这个结构并尝试实现 IntoIterator 特征:

struct NodeIter<'a, T>{
    children: &'a [Node<T>],
    parent: Option<&'a Node<T>>,
}

impl<'a, T> IntoIterator for Node<T> {
    type Item = T;
    type IntoIter = NodeIter<'a, T>;

    fn into_iter(self) -> Self::IntoIter {
        todo!()
    }
}

我无法找出正确的生命周期说明符,我最终得到这个错误:

error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates
  --> src/tree_my.rs:44:6
   |
44 | impl<'a, T> IntoIterator for Node<T> {
   |      ^^ unconstrained lifetime parameter

我是 Rust 的新手,我不确定我是做错了还是不可能。因为我读过类似的问题。这个问题似乎与特征(在我的例子中是IntoIterator)和相关类型有关。我还阅读了一些关于 GAT 的内容。

也许有人可以解释这个问题以及如何解决它。

Rust Playground

【问题讨论】:

    标签: rust lifetime associated-types


    【解决方案1】:

    IntoIterator::into_iter消费它的论点。这意味着一旦您调用了node.into_iter()node 就不再存在,但看起来您希望您的NodeIter 保留对node 的引用,这是不可能的,因为它不再存在。

    您需要更改 NodeIter 以获取原始 Node 的所有权,以便 NodeIter 可以在需要时保持 Node 有效,或者实施 IntoIter参考Node(这将消耗引用,但保持原始Node不变):

    enum Node<T> {
        Leaf(T),
        Children(Vec<Node<T>>),
    }
    
    struct NodeIter<'a, T>{
        children: &'a [Node<T>],
        parent: Option<&'a Node<T>>,
    }
    
    impl<'a, T> Iterator for NodeIter<'a, T> {
        type Item = T;
        fn next (&mut self) -> Option<Self::Item> {
            todo!();
        }
    }
    
    impl<'a, T> IntoIterator for &'a Node<T> {
        type Item = T;
        type IntoIter = NodeIter<'a, T>;
    
        fn into_iter(self) -> Self::IntoIter {
            todo!()
        }
    }
    

    Playground

    【讨论】:

      猜你喜欢
      • 2018-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 2020-11-05
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      相关资源
      最近更新 更多