gpt4 book ai didi

rust - 意外的自动取消引用行为

转载 作者:行者123 更新时间:2023-12-03 11:23:55 25 4
gpt4 key购买 nike

当尝试在 rust 中实现双链表时,我发现以下意外错误

if let Some(link) = self.tail.take() {
let x = link.borrow_mut();
link.borrow_mut().next = Some(node.clone());
} else { ... }

这里的链接被推断为 Rc<RefCell<Node<..>>>和编译器说:

Cannot borrow immutable local variable link as mutable.



经过尝试,我猜是什么时候 use std::borrow::BorrowMut ,发生错误。

// compiles
fn test1() {
let a = Rc::new(RefCell::new(1));
let b = RefCell::new(1);
b.borrow_mut();
a.borrow_mut();
}

// doesn't compile
fn test2() {
use std::borrow::BorrowMut; // inserted this import!

let a = Rc::new(RefCell::new(1));
let b = RefCell::new(1);
b.borrow_mut();
a.borrow_mut();
}

这里 test2()编译失败。我想知道为什么它会这样工作。

最佳答案

您要调用的是方法 RefCell::borrow_mut() .

然而,aRc而不是 RefCell ,所以它没有 borrow_mut方法。这是自动取消引用进入画面的地方。因为 Rc<RefCell<T>>实现 Deref trait,它可以自动取消引用到 &RefCell<T> at 方法调用,这正是第一个测试中发生的情况。

现在,如果我们导入 BorrowMut trait,测试停止工作。这是因为 BorrowMut trait 还有一个方法叫做 borrow_mut , 即 implemented for all types :

impl<T: ?Sized> BorrowMut<T> for T { ... }

这意味着现在有一个 borrow_mut方法适用于 Rc ,因此不会发生自动取消引用,并且我们的代码调用了错误的方法。

关于自动解引用如何工作的最全面的解释是在 this SO answer 中。 .

关于rust - 意外的自动取消引用行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62108325/

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