强制一个结构比另一个结构寿命更长

Deb*_*aug 1 lifetime rust

我有两个结构。第一个“父”结构包含需要显式清理的资源,我通过派生Drop特征来处理该资源。第二个“子”结构是从父结构中检索的,并且需要该资源尚未被释放才能有效。

\n

换句话说,任何父实例的寿命都必须比其子实例的寿命长。

\n

我的解决方案使用引用来使借用检查器强制执行此规则。

\n
struct 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}\n
Run Code Online (Sandbox Code Playgroud)\n

这是可行的,但Child\xc2\xa0 实际上不需要知道它的父级。我想用以下内容替换参考字段PhantomData

\n
struct Child<\'a> {\n    _parent: PhantomData<&\'a Parent>,\n    // Private data.\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但在这种情况下,我如何将_parent\xc2\xa0“绑定”到父实例Parent::new_child

\n

Ian*_* S. 5

您可以执行以下操作:

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)

这应该会给你想要的行为。