gpt4 book ai didi

rust - 在 Rust 中引用一个包含结构(并调用它的方法)

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

Editor's note: This code example is from a version of Rust prior to 1.0 and is not syntactically valid Rust 1.0 code. Updated versions of this code produce different errors, but the answers still contain valuable information.

我正在尝试用 Rust 编写一个容器结构,其中的元素还存储对包含容器的引用,以便它们可以调用其上的方法。据我所知,我需要通过 Rc<RefCell<T>> 来做到这一点.这是正确的吗?

到目前为止,我有如下内容:

struct Container {
elems: ~[~Element]
}

impl Container {
pub fn poke(&mut self) {
println!("Got poked.");
}
}

struct Element {
datum: int,
container: Weak<RefCell<Container>>
}

impl Element {
pub fn poke_container(&mut self) {
let c1 = self.container.upgrade().unwrap(); // Option<Rc>
let mut c2 = c1.borrow().borrow_mut(); // &RefCell
c2.get().poke();
// self.container.upgrade().unwrap().borrow().borrow_mut().get().poke();
// -> Error: Borrowed value does not live long enough * 2
}
}

fn main() {
let container = Rc::new(RefCell::new(Container{ elems: ~[] }));
let mut elem1 = Element{ datum: 1, container: container.downgrade() };
let mut elem2 = Element{ datum: 2, container: container.downgrade() };
elem1.poke_container();
}

我觉得我在这里遗漏了一些东西。正在访问 Rc<RefCell<T>> 的内容真的这么难(在 poke_container 中)?还是我以错误的方式解决了问题?

最后,假设方法是正确的,我将如何编写 add Container 的方法这样它就可以填写container Element 中的字段(假设我将字段更改为 Option<Rc<RefCell<T>>> 类型?据我所知,我无法从 Rc 创建另一个 &mut self

最佳答案

长长的方法调用链实际上在 master 上对我有效,没有任何变化,因为“r-values”(例如函数调用的结果)的生命周期已经改变,因此临时返回值持续到 master 结束语句,而不是下一个方法调用的结束(这似乎是旧规则的工作方式)。

正如 Vladimir 暗示的那样,可重载的取消引用可能会将其减少到

self.container.upgrade().unwrap().borrow_mut().poke();

哪个更好。

在任何情况下,无论是单一所有权代码还是不可变共享所有权代码,在 Rust 中“改变”共享所有权总是(稍微)更难编写,因为这样的代码很容易成为内存不安全的(和内存安全是 Rust 的核心目标)。

关于rust - 在 Rust 中引用一个包含结构(并调用它的方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21389805/

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