如何实现对二叉搜索树右边缘值的可变引用的迭代器?

时间:2016-06-29 03:11:08

标签: rust

我在Rust中实现了一个简单的二进制搜索树(遵循CIS 198,它很棒),并且为了学习我只做贯穿右边缘的迭代器。

我无法实现一个提供可变引用的迭代器。我尝试了很多方法,但Rust编译器都没有接受。我需要帮助的代码是下面的代码(while I made a gist with the complete code here):

#[derive(Debug)]
pub struct Tree<T>(Option<Box<Node<T>>>);

#[derive(Debug)]
pub struct Node<T> {
    elem: T,
    left: Tree<T>,
    right: Tree<T>,
}

// MUTABLE BORROW STRUCT
pub struct IterMut<'a, T: 'a> {
    next: &'a mut Tree<T>,
}

// MUTABLE BORROW NEXT (I'M STUCK HERE, NOTHING WORKS)
impl<'a, T> Iterator for IterMut<'a, T> {
    type Item = &'a mut T;
    fn next(&mut self) -> Option<Self::Item> {
        // 1 try: cannot infer lifetime
        self.next.0.as_mut().map(|node| {
            self.next = &mut node.right;
            &mut node.elem
        })

        // 2 try: node.right, node.elem does not live long enough
        self.next.0.take().map(|node| {
            self.next = &mut node.right;
            &mut node.elem
        })
    }
}

2 个答案:

答案 0 :(得分:7)

您需要将字段IterMut::next的类型更改为Option<&'a mut Node<T>>

pub struct IterMut<'a, T: 'a> {
    next: Option<&'a mut Node<T>>,
}

impl<'a, T> Iterator for IterMut<'a, T> {
    type Item = &'a mut T;
    fn next(&mut self) -> Option<Self::Item> {
        self.next.take().map(|node| {
            self.next = node.right.0.as_mut().map(|node| &mut **node);
            &mut node.elem
        })

    }
}

您可以找到有关递归数据结构in the IterMut chapter of Learning Rust With Entirely Too Many Linked Lists的可变迭代器实现的更多有用信息。

答案 1 :(得分:1)

认为你不能将self分成2个可变对象(一个用于Item,一个用于self本身)而不使用一些不安全的代码。< / p>