我有两个结构。第一个“父”结构包含需要显式清理的资源,我通过派生Drop特征来处理该资源。第二个“子”结构是从父结构中检索的,并且需要该资源尚未被释放才能有效。
换句话说,任何父实例的寿命都必须比其子实例的寿命长。
\n我的解决方案使用引用来使借用检查器强制执行此规则。
\nstruct Parent {\n // Private resource data.\n}\n\nimpl Parent {\n fn new() -> Self {\n Parent {}\n }\n\n fn new_child(&self) -> Child {\n return Child { _parent: self };\n }\n}\n\nimpl Drop for Parent {\n fn drop(&mut self) {\n // Do some cleanup after which no instance of Child will be valid.\n }\n}\n\nstruct Child<\'a> {\n _parent: &\'a Parent,\n // Private data.\n}\n\nimpl<\'a> Child<\'a> {\n fn hello(&self) {\n println!("Hello Child!");\n }\n}\n\nfn main() {\n let parent = Parent::new();\n let child = parent.new_child();\n child.hello();\n\n // Fails to compile with the following line uncommented (as intented).\n // drop(parent);\n // child.hello();\n}\nRun Code Online (Sandbox Code Playgroud)\n这是可行的,但Child\xc2\xa0 实际上不需要知道它的父级。我想用以下内容替换参考字段PhantomData:
struct Child<\'a> {\n _parent: PhantomData<&\'a Parent>,\n // Private data.\n}\nRun Code Online (Sandbox Code Playgroud)\n但在这种情况下,我如何将_parent\xc2\xa0“绑定”到父实例Parent::new_child?
您可以执行以下操作:
struct Parent {
// Private resource data.
}
struct Child<'a> {
_parent: PhantomData<&'a Parent>,
// Private data.
}
impl Parent {
// The returned child borrows from self
fn new_child(&self) -> Child<'_> {
Child { _parent: PhantomData }
}
}
Run Code Online (Sandbox Code Playgroud)
这应该会给你想要的行为。
| 归档时间: |
|
| 查看次数: |
162 次 |
| 最近记录: |