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 从单个链接列表中删除重复项 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移动。但

上面的代码删除自定义单链表中的重复项。(例如[1,1,2]->[1,2])
使用(2)和(4)编译并执行程序应该执行的操作。
(1) (3)生成编译器错误,我无法理解这里发生了什么

  • (1) 为什么我们需要
    as_mut()
    ?我相信cur已经是可变的了
  • (3) 为左值赋值时,为什么不能将
    用作\u ref()
  • (4) 当我们继续进行时,这不是在消耗选项吗

我创建了一个可复制的。其他人,请用它来帮助和纠正我,如果我的答案是错误的

对于(1),当调用
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