对其所有者具有弱引用的结构的构造函数



试图实现一个数据结构;事物;可以由";所有者";,而每个";事物;应该知道它的所有者是谁。据我所知,这可以通过在每个";事情";。我不知道如何为这些结构实现构造函数(new(函数。以下是我尝试做的事情的简化结构:

use std::rc::{Rc, Weak};
struct Owner {
thing1: Thing,
thing2: Thing,
}
impl Owner {
fn new() -> Self {
Self {
thing1: Thing::new(???),   // 1
thing2: Thing::new(???),   // 1
}
}
}
struct Thing {
owner: Weak<Owner>,
value: u32,
}
impl Thing {
fn new(owner: ???) -> Self {      // 2
Self {
owner: Weak::clone(???),  // 2
value: 0,
}
}
}

所以在这里我不能搞清楚两件事:

  1. 在构造Owner时-如何将自身作为参数传递给"的构造函数;事情">
  2. 在构建Thing时,如何准确地创建对所有者的引用

也许我的方法完全错误,在这种情况下,请建议正确的方法。

更新:
此类结构的用例的更具体示例:考虑电子电路模拟;事物;是电子元件的引脚;所有者";。因此,每次从外部更改端号的值时,都应该触发所有者组件,而所有者组件又会更改其他连接器值。

首先,正如其他人所提到的,这可能是一个坏主意,不仅会导致较差的性能,而且很难进行编码。有了这个警告,就可以找到答案了。

这有点棘手,因为现在在稳定的Rust中,您需要初始化所有者才能获得对它的引用(因此您可能需要每个字段都是Option<Thing>;这并不理想(。

然而,幸运的是,有一种新的不稳定方法Rc::new_cyclic,我认为它正是你想要的:

游乐场

#![feature(arc_new_cyclic)]
use std::rc::{Rc, Weak};
struct Owner {
thing1: Thing,
thing2: Thing,
}
impl Owner {
fn new() -> Rc<Self> {
Rc::new_cyclic(|weak| {
Self {
thing1: Thing::new(weak.clone()),
thing2: Thing::new(weak.clone()),
}
})
}
}
struct Thing {
owner: Weak<Owner>,
value: u32,
}
impl Thing {
fn new(owner: Weak<Owner>) -> Self {
Self {
owner,
value: 0,
}
}
}

最新更新