gpt4 book ai didi

rust - Rust 中的可变借用

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

我是 Rust 的新手,我只是在做一些练习。有一个链表。比如0->1->2->3->4,在索引2处截断,然后将两者反转,再合成。 => 0<-1<-2 3<-4 => 2->1->0->4->3

#[derive(debug)]
struct Node{
val: usize,
next: Option<Box<Node>>,
}

impl Node {
fn new(i: usize) -> Node {
...
}

fn reverse_at(self, k: usize) -> Box<Node> {
let mut prev = None;
let mut curr = Box::new(self);

let first_part_tail = &mut curr;

let mut i: usize = 0;
while i <= k {
let next = curr.next.take();
curr.next = prev;
match next {
Some(next_node) => {
prev = Some(curr);
curr = next_node;
}
None => return curr,
}
i += 1;
}

let head = prev.unwrap();
prev = None;
loop {
let next = curr.next.take();
curr.next = prev;
match next {
Some(next_node) => {
prev = Some(curr);
curr = next_node;
}
None => {
first_part_tail.next = Some(curr);
return head;
}
}
}
}
}

我需要获取第一个节点的可变借用0,获取最后一个节点后设置0.next=4< strong>4 在函数的末尾。但是节点0的所有权已经发送给节点1。显然,error[E0499]: cannot borrow `curr.next` as mutable a more than once a time 发生了,我不知道该怎么做。这困扰了我很长时间。请提供任何帮助。

play.rust-lang.org/...

&,我想这个函数会改变节点本身。而且我不知道如何将 self 引用更改为新节点,所以我使用了 self。如果有人可以修改它,那也有帮助。也许,将此功能更改为

fn reverse_at(&mut self, k:usize){
...
}

最佳答案

@Ultrasaurus 感谢学习资源https://rust-unofficial.github.io/too-many-lists/ .现在我解决了这个问题,虽然这需要一些时间。

最终代码在这里playground

有点奇怪,我的LinkedNumber.headNode ,导致 LinkedNumber总是有一个头,可能为零,但不为空。也许应该是Box<Node> .

在第 71 行,我使用 ptr::read , 它将

Reads the value from src without moving it.

mem::take也可以但它需要初始 Node默认值为 trait Default .

比我用Box::new将节点从堆栈移动到堆中。 (没有必要这样做,如果 LinkedNumber.headBox<Node> )

在第 73 行,标记 raw_pointer *const Node

在第 94 行,如果链接被分成两部分,则转换 *const Node进入*mut Node , 取消引用它,设置 (*ptr).next与原始链接的最后一个节点。

如何测试:更改num.reverse_at(3)中的数字在第 171 行,它工作正常。

关于rust - Rust 中的可变借用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58350593/

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