Rust 从单个链接列表中删除重复项 pub fn delete_duplicates(标题:选项)->Option{ 让mut head=head; 设mut cur=head.as_mut(); 而cur.is_some()&cur.as_ref().unwrap()。next.is_some(){ 如果当前作为参考().unwrap().val==当前作为参考().unwrap().next.as参考().unwrap().val{ //让next=cur.unwrap().next.as_mut().unwrap().next.take();(1)错误! 让next=cur.as_mut().unwrap().next.as_mut().unwrap().next.take();/(2)确定 cur.as_mut().unwrap().next=next; } 否则{ //cur=cur.as_ref().unwrap().next.as_mut();(3)错误! cur=cur.unwrap().next.as_mut();/(4)确定 } } 头 }
上面的代码删除自定义单链表中的重复项。(例如[1,1,2]->[1,2])Rust 从单个链接列表中删除重复项 pub fn delete_duplicates(标题:选项)->Option{ 让mut head=head; 设mut cur=head.as_mut(); 而cur.is_some()&cur.as_ref().unwrap()。next.is_some(){ 如果当前作为参考().unwrap().val==当前作为参考().unwrap().next.as参考().unwrap().val{ //让next=cur.unwrap().next.as_mut().unwrap().next.take();(1)错误! 让next=cur.as_mut().unwrap().next.as_mut().unwrap().next.take();/(2)确定 cur.as_mut().unwrap().next=next; } 否则{ //cur=cur.as_ref().unwrap().next.as_mut();(3)错误! cur=cur.unwrap().next.as_mut();/(4)确定 } } 头 },rust,Rust,上面的代码删除自定义单链表中的重复项。(例如[1,1,2]->[1,2]) 使用(2)和(4)编译并执行程序应该执行的操作。 (1) (3)生成编译器错误,我无法理解这里发生了什么 (1) 为什么我们需要as_mut()?我相信cur已经是可变的了 (3) 为左值赋值时,为什么不能将用作\u ref() (4) 当我们继续进行时,这不是在消耗选项吗 我创建了一个可复制的。其他人,请用它来帮助和纠正我,如果我的答案是错误的 对于(1),当调用cur.unwrap()时,值(选项)从cur移动。但
使用(2)和(4)编译并执行程序应该执行的操作。
(1) (3)生成编译器错误,我无法理解这里发生了什么
- (1) 为什么我们需要
?我相信cur已经是可变的了as_mut()
- (3) 为左值赋值时,为什么不能将
用作\u ref()
- (4) 当我们继续进行时,这不是在消耗选项吗
cur.unwrap()
时,值(选项
)从cur
移动。但是当您调用cur.as_mut()
时,它会给您一个选项
,并且展开它不会移动cur
的值。我创建了一个小代码片段来说明这一点
对于(3),它有两个错误
cur.as_ref()
时,该值位于&
后面,因此您无法访问它的值,但在调用as_ref()
as_ref()
调用(3)替换为as_mut()
调用,则只会看到另一个错误
pub fn delete_duplicates(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
let mut head = head;
let mut cur = head.as_mut();
while cur.is_some() && cur.as_ref().unwrap().next.is_some() {
if cur.as_ref().unwrap().val == cur.as_ref().unwrap().next.as_ref().unwrap().val {
//let next = cur.unwrap().next.as_mut().unwrap().next.take(); (1) Error!
let next = cur.as_mut().unwrap().next.as_mut().unwrap().next.take(); // (2) Ok
cur.as_mut().unwrap().next = next;
}
else {
//cur = cur.as_ref().unwrap().next.as_mut(); (3) Error!
cur = cur.unwrap().next.as_mut(); // (4) Ok
}
}
head
}
您不能先借用cur
的值,用新值重新指定cur
,然后使用借用的值。为了说明这一点
对于(4),是的,它使用
cur
的值,这是一个选项
,而不是选项
,所以它是可以的。很难回答您的问题,因为它不包括一个。我们无法说出代码中存在哪些板条箱(及其版本)、类型、特征、字段等。如果您试图重现您的错误(如果可能的话),或者在全新的货运项目中,那么我们将更容易帮助您,然后您的问题将包括附加信息。您可以使用以下方法减少在此处发布的原始代码。谢谢请回答您的问题,并粘贴您得到的准确和完整的错误-这将帮助我们了解问题所在,以便我们能够提供最好的帮助。有时,试图解释错误消息是很棘手的,而这实际上是错误消息的另一个重要部分。请使用直接运行编译器的消息,而不是IDE生成的消息,IDE可能试图为您解释错误。
Line 28, Char 17: cannot assign to `cur` because it is borrowed (solution.rs)
|
28 | cur = cur.as_mut().unwrap().next.as_mut();
| ^^^^^^---^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| | |
| | borrow of `cur` occurs here
| assignment to borrowed `cur` occurs here
| borrow later used here
error: aborting due to previous error