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
}
上面的代码删除了自定义单链表中的重复项。(例如[1,1,2]->[1,2](
使用(2(和(4(编译并执行程序应该执行的操作。
(1(和(3(生成编译器错误,我无法理解这里发生了什么。
- (1(为什么我们需要
as_mut()
?我相信cur已经变了 - (3( 为什么在为左值赋值时不能使用
as_ref()
- (4( 这不是在消耗我们前进的选项吗
我创建了一个可复制的游乐场。其他人,如果我的答案是错误的,请用它来帮助和纠正我。
对于(1(,当您调用cur.unwrap()
时,值(Option<&mut Box<ListNode>>
(从cur
移动。但当您调用cur.as_mut()
时,它会给您一个Option<&mut &mut Box<ListNode>>
,并且展开它不会移动cur
的值。我创建了一个小的操场代码片段来说明这一点。
对于(3(,它有两个错误。
-
当您调用
cur.as_ref()
时,该值位于&
之后,因此您无法访问其值,但在调用as_mut()
时再次将其作为可变值借用 -
如果将(3(中的
as_ref()
调用替换为as_mut()
调用,则只会看到另一个错误。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
不能先借用
cur
的值,然后用新值重新分配cur
,然后再使用借用的值。游乐场来说明这一点。
对于(4(,是的,它消耗cur
的值,这是Option<&mut Box<ListNode>>
,而不是Option<Box<ListNode>>
,所以它是可以的