gpt4 book ai didi

rust - 如何正确访问 RefCell 中的值

转载 作者:行者123 更新时间:2023-11-29 07:53:21 26 4
gpt4 key购买 nike

我正试图在 Rust 中专注于 RcRefCell。我想要实现的是对相同对象有多个可变引用。

我想出了这个伪代码:

use std::rc::Rc;
use std::cell::RefCell;

struct Person {
name: String,
mother: Option<Rc<RefCell<Person>>>,
father: Option<Rc<RefCell<Person>>>,
partner: Option<Rc<RefCell<Person>>>
}

pub fn main () {

let mut susan = Person {
name: "Susan".to_string(),
mother: None,
father: None,
partner: None
};

let mut boxed_susan = Rc::new(RefCell::new(susan));

let mut john = Person {
name: "John".to_string(),
mother: None,
father: None,
partner: Some(boxed_susan.clone())
};

let mut boxed_john = Rc::new(RefCell::new(john));

let mut fred = Person {
name: "Fred".to_string(),
mother: Some(boxed_susan.clone()),
father: Some(boxed_john.clone()),
partner: None
};

fred.mother.unwrap().borrow_mut().name = "Susana".to_string();

println!("{}", boxed_susan.borrow().name);

// boxed_john.borrow().partner.unwrap().borrow_mut().name = "Susanna".to_string();
// println!("{}", boxed_susan.borrow().name);

}

最有趣的部分是:

    fred.mother.unwrap().borrow_mut().name = "Susana".to_string();
println!("{}", boxed_susan.borrow().name)

我更改了 Freds 母亲的名字,然后打印出 Susan 的名字,这应该恰好是完全相同的引用。令人惊讶的是,它打印出“Susana”,所以我假设我的共享可变引用的小实验是成功的。

但是,现在我想再次改变它,这次以 John 的伙伴身份访问它,这也应该是完全相同的实例。

不幸的是,当我评论以下两行时:

// boxed_john.borrow().partner.unwrap().borrow_mut().name = "Susanna".to_string();
// println!("{}", boxed_susan.borrow().name);

我遇到了我的老 friend cannot move out of dereference of&-pointer。我在这里做错了什么?

最佳答案

这将解决它:

boxed_john.borrow().partner.as_ref().unwrap().borrow_mut().name = "Susanna".to_string();

问题是 unwrap()Option<Rc<RefCell>> 上,它消耗了 Option(即移出它),但你只有一个借来的指针。 as_ref转换 Option(T)Option(&T)unwrap将其转换为 &T , 避免任何移动。

另请注意:您的变量具有比实际需要更多的可变性。但我相信您已经看到了编译器的警告。

关于rust - 如何正确访问 RefCell 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25297447/

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