如何解决引用相同/包含结构中的字段 1 Parent未实现dyn Any 2在同一结构中存储值和对该值的引用
我已经创建了这个简单的示例来模拟程序中引用发生的情况。
struct Child {}
struct Parent<'a> {
child: &'a Child
}
struct Family {
child: Box<Child>,parents: Vec<Box<dyn Any>>
}
fn main() {
let child = Box::new(Child {});
let mut family = Family { child,parents: vec![] }; // child was moved to the family
let parent = Box::new(Parent { child: &family.child }); // Parent accepts reference to family's child
family.parents.push(parent); // Now parent was moved to the family.
// So Family owns both: child and parent,// so reference to the child in the parent will be correct during
// lifetime of family
}
此代码对我来说是正确的,因为该家族同时拥有:“孩子”和“父母”,因此它们将被同时删除,并且“父母”可以安全地保存对孩子的引用。但是rust编译器却不这么认为:
error[E0597]: `family.child` does not live long enough
|
18 | let parent = Box::new(Parent { child: &family.child }); // Parent accepts reference to family's child
| ^^^^^^^^^^^^^ borrowed value does not live long enough
19 |
20 | family.parents.push(parent); // Now
| ------ cast requires that `family.child` is borrowed for `'static`
21 | }
| - `family.child` dropped here while still borrowed
故意使用dyn Any
和方框-它模拟了程序中发生的事情。
解决方法
您似乎有两个不相关的问题:
1。 Parent
未实现dyn Any
尽管有名称,但并非每种类型都实现Any
特性,如std::any
documentation中所述:
大多数类型实现
Any
。但是,任何包含非'static
引用的类型都不会。
因此,您的Parent
结构无法实现Any
(除非它被限制为只有'static
个子对象)。正如您所说的dyn Any
来自程序的其余部分,很难建议解决方案。
2。在同一结构中存储值和对该值的引用
此问题已被询问过,并且有一个truly excellent answer。
自引用结构的常见问题是,如果不使引用无效,则无法移动它们。
但是,在某些情况下,我们可以安全地移动自引用结构,例如在Box
引用的值(如您的Family
中)只要装箱的值永远不会移动。链接到答案的内容涵盖了这种情况,并列出了可能的解决方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。