我在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
})
}
}
答案 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>