gpt4 book ai didi

reference - RefCell 和 RefCell<&X> 上的 borrow_mut 之间的区别

转载 作者:行者123 更新时间:2023-11-29 07:59:57 25 4
gpt4 key购买 nike

如果我做对了,就不可能通过 std::rc::Rc 创建一个可变的借用。在 Rust 中,你必须使用 CellRefCell .但无论如何我无法理解如何使用它们。例如考虑这个简单的 example :

use std::cell::RefCell;

struct X (i32);

impl X {
fn foo(&mut self) {
self.0 = 0;
}
}

fn main () {
let x = X(5);
let rcx = RefCell::new(&x);

let mut mutx: std::cell::RefMut<&X> = rcx.borrow_mut();
(*mutx).foo();
}

我收到以下错误:

16:5: 16:9 error: cannot borrow immutable local variable `mutx` as mutable
16 mutx.foo();

但是如果我从行中删除引用(并更新 mutx 的类型):

let rcx = RefCell::new(x);

一切都很好。但我不明白为什么,因为 RefMut::deref_mut() -> &mut T在第 16 行调用的 deference 应该返回 &&mut T在第一种情况下,&mut T在第二种情况下。但是由于编译器应该应用很多 *根据需要(如果我知道 deref coercion 是如何工作的) RefMut<X>::deref_mut() 之间应该没有区别和 RefMut<&X>::deref_mut()

编辑:一不小心忘了写mut在链接示例中的第 15 行已正确写入。所以现在是let mut mutx...

最佳答案

问题源于您在 RefCell 中存储了一个不可变引用。我不清楚你为什么想要这样的东西。正常模式是将整个值放入 RefCell,而不仅仅是引用:

fn main () {
let rcx = RefCell::new(X(5));

let mut mutx = rcx.borrow_mut();
mutx.foo();
}

原始问题的问题

你有两个复合错误。让我们检查整个错误消息:

<anon>:16:5: 16:12 error: cannot borrow immutable borrowed content as mutable
<anon>:16 (*mutx).foo();
^~~~~~~
<anon>:16:7: 16:11 error: cannot borrow immutable local variable `mutx` as mutable
<anon>:16 (*mutx).foo();
^~~~

注意第二个错误——“不能借用不可变局部变量mutx”。那是因为您需要将 mutx 变量声明为可变的:

let mut mutx: std::cell::RefMut<&X> = rcx.borrow_mut();

这将允许 mutx 参与 DerefMut

关于reference - RefCell<X> 和 RefCell<&X> 上的 borrow_mut 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32591523/

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