我刚刚开始使用Ruust,并试图实现一些简单的数据 struct .我在双向链表的迭代器上收到以下错误,我不明白为什么会发生这种情况.
use std::cell::RefCell;
use std::rc::Rc;
struct Node<T> {
value: T,
next: Option<Rc<RefCell<Node<T>>>>,
prev: Option<Rc<RefCell<Node<T>>>>,
}
impl<T> Node<T> {
fn new(value: T) -> Rc<RefCell<Self>> {
Rc::new(RefCell::new(Node {
value,
next: None,
prev: None,
}))
}
}
pub struct DoublyLinkedList<T> {
head: Option<Rc<RefCell<Node<T>>>>,
tail: Option<Rc<RefCell<Node<T>>>>,
len: usize,
}
impl<T> DoublyLinkedList<T> {
pub fn new() -> Self {
DoublyLinkedList {
head: None,
tail: None,
len: 0,
}
}
pub fn len(&self) -> usize {
self.len
}
pub fn is_empty(&self) -> bool {
self.len == 0
}
pub fn push_front(&mut self, value: T) {
let new_node = Node::new(value);
match self.head.take() {
Some(old_head) => {
old_head.borrow_mut().prev = Some(new_node.clone());
new_node.borrow_mut().next = Some(old_head);
self.head = Some(new_node);
}
None => {
self.head = Some(new_node.clone());
self.tail = Some(new_node);
}
}
self.len += 1;
}
pub fn push_back(&mut self, value: T) {
let new_node = Node::new(value);
match self.tail.take() {
Some(old_tail) => {
old_tail.borrow_mut().next = Some(new_node.clone());
new_node.borrow_mut().prev = Some(old_tail);
self.tail = Some(new_node);
}
None => {
self.head = Some(new_node.clone());
self.tail = Some(new_node);
}
}
self.len += 1;
}
pub fn pop_front(&mut self) -> Option<T> {
self.head.take().map(|old_head| {
match old_head.borrow_mut().next.take() {
Some(new_head) => {
new_head.borrow_mut().prev = None;
self.head = Some(new_head);
}
None => {
self.tail = None;
}
}
self.len -= 1;
Rc::try_unwrap(old_head).ok().unwrap().into_inner().value
})
}
pub fn pop_back(&mut self) -> Option<T> {
self.tail.take().map(|old_tail| {
match old_tail.borrow_mut().prev.take() {
Some(new_tail) => {
new_tail.borrow_mut().next = None;
self.tail = Some(new_tail);
}
None => {
self.head = None;
}
}
self.len -= 1;
Rc::try_unwrap(old_tail).ok().unwrap().into_inner().value
})
}
pub fn iter(&self) -> Iter<T> {
Iter {
next: self.head.as_ref().map(|node| node.clone()),
}
}
}
pub struct Iter<T> {
next: Option<Rc<RefCell<Node<T>>>>,
}
impl<T> Iterator for Iter<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
self.next.take().map(|node| {
self.next = node
.borrow()
.next
.as_ref()
.map(|next_node| next_node.clone());
node.borrow().value
// Rc::try_unwrap(node).ok().unwrap().into_inner().value
})
}
}
我本以为借入将能够提取RefCell的内部值,但我收到以下错误:
cannot move out of dereference of `Ref<'_, Node<T>>`
node.borrow().value
move occurs because value has type `T`, which does not implement the `Copy` trait
然而,下面注释掉的代码可以工作.