gpt4 book ai didi

rust - while 循环中变量的突变

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

我正在尝试构建一个单链表:

pub struct Node<T> {
pub element: T,
pub next: Option<Box<Node<T>>>,
}

struct List<T> {
head: Option<Node<T>>,
}

impl<T> List<T> {
fn new() -> Self {
List { head: None }
}

fn add(&mut self, element: T) {
let node = Node {
next: None,
element,
};
// get the node at the end of the list
match self.head {
None => self.head = Some(node),
Some(_) => {
let mut last_node: Option<Box<&Node<T>>> =
Some(Box::new(self.head.as_ref().unwrap()));
while let Some(node) = last_node {
let n = node.next.take().map(|n| &n);
last_node = n;
}
}
}
}
}

fn main() {}

我遇到编译错误:

error[E0308]: mismatched types
--> src/main.rs:28:33
|
28 | last_node = n;
| ^ expected struct `std::boxed::Box`, found reference
|
= note: expected type `std::option::Option<std::boxed::Box<&Node<T>>>`
found type `std::option::Option<&std::boxed::Box<Node<T>>>`

虽然我理解错误背后的原因,但我无法解决这个问题。

我需要在列表的最后添加一个元素。为此,我采用了重复循环列表的下一个元素的方法,直到它不是 None 并在那里设置新值。

我知道这是我们在 C 或 Java 中执行的命令式方法。我不确定如何在 Rust 中执行此操作。

最佳答案

我将按如下方式实现 add 方法。

fn add(&mut self, element: T) {
let node = Node { element, next: None };
match self.head {
None => {
self.head = Some(node);
}
Some(ref mut head) => {
let mut cur = head;
while cur.next.is_some() {
cur = {cur}.next.as_mut().unwrap();
}
cur.next = Some(Box::new(node));
}
}
}

测试实现:

fn main() {
let mut list = List::new();
println!("{:?}", list);

list.add(5);
println!("{:?}", list);

list.add(4);
println!("{:?}", list);

list.add(3);
println!("{:?}", list);
}

输出是:

List { head: None }
List { head: Some(Node { element: 5, next: None }) }
List { head: Some(Node { element: 5, next: Some(Node { element: 4, next: None }) }) }
List { head: Some(Node { element: 5, next: Some(Node { element: 4, next: Some(Node { element: 3, next: None }) }) }) }

关于rust - while 循环中变量的突变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48406077/

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