gpt4 book ai didi

rust - 我在这段代码中为队列实现 `dequeue` 函数做错了什么?

转载 作者:行者123 更新时间:2023-11-29 08:29:58 26 4
gpt4 key购买 nike

我正在尝试为队列实现一个dequeue 函数,但我对借用检查器的工作原理感到困惑。我在这段代码中做错了什么?

use std::cell::RefCell;
use std::rc::Rc;
use std::mem::replace;

type Link<T> = Option<Rc<RefCell<Node<T>>>>;

struct Node<T>{
item: T,
next: Link<T>
}
pub struct Queue<T>{
first: Link<T>,
last: Link<T>,
length: usize
}

impl<T> Queue<T>{
pub fn new() -> Queue<T> {
Queue {
first: None,
last: None,
length: 0
}
}
pub fn is_empty(&self) -> bool {
self.length == 0
}
pub fn size(&self) -> usize {
self.length
}
pub fn enqueue(&mut self, item: T) {
let temp = self.last.take();
self.last = Some(Rc::new(RefCell::new(Node{
item,
next: None
})));
if self.is_empty() {
self.first = self.last.clone();
} else {
let temp = temp.unwrap();
temp.borrow_mut().next = self.last.clone();
}
self.length += 1;
}
pub fn dequeue(&mut self) -> Result<T, String>{
if let Some(ref mut value) = self.first.take() {
let mut temp = *(value.borrow_mut());
let next = *(temp.next.unwrap().borrow_mut());
let old_value = replace(&mut temp, next);
return Ok(old_value.item);
}
Err("Queue is empty".to_owned())
}
}

获得了对 Some 中值的可变引用后,我想替换为节点的 next 字段引用的节点。我是否需要获取 Some 中的值的所有权?我什至可以这样做吗?

最佳答案

下面是dequeue的一个实现:

pub fn dequeue(&mut self) -> Result<T, String> {
// First, disconnect `self.last` from the element it is pointing,
// since it will have to be updated anyway. If there is no elemen in the
// queue, we're done.
let first = try!(self.first.take().ok_or("Queue is empty".to_owned()));
// if there are two Rc's pointing to this node, then this must be the
// only node, so `self.last` has to go
if Rc::strong_count(&first) == 2 {
self.last = None;
}
let first_node = Rc::try_unwrap(first).ok().expect(
"This should be the only owner of the node"
).into_inner();
self.first = first_node.next;
self.length -= 1;
Ok(first_node.item)
}

Here is the complete code .我还添加了一个 dequeue_back 来使这几乎是一个双端队列和一些测试。

关于rust - 我在这段代码中为队列实现 `dequeue` 函数做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45530445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com