如何强制父子结构生存期



我正在为外部C库编写包装器代码,并试图说服Rust编译器强制执行Rust代码本身没有反映的外部生存期限制。例如,一种类型的"不透明句柄"可以返回仅在父句柄的生存期内有效的子句柄。

我尝试了std::marker::PhantomData,但我无法说服编译器返回预期的错误。

换句话说,我希望以下代码块编译失败:

struct Parent;
struct Child; // Note that there is no reference to the parent struct
impl Parent {
    fn get_child( &self ) -> Child {
        Child
    }
}
// I'd like this to complain with "p does not live long enough"
fn test() -> Child {
    let p = Parent;
    p.get_child()
}
fn main() {
    let c = test();
}

您对PhantomData的想法是正确的。您可以向Child添加生存期参数和PhantomData字段。PhantomData泛型参数是您想要在结构中模拟的参数。在这种情况下,您希望Child的行为就像它包含&Parent一样。

struct Child<'a> {
    parent: PhantomData<&'a Parent>,
}
impl Parent {
    fn get_child<'a>(&'a self) -> Child<'a> {
        Child {
            parent: PhantomData,
        }
    }
}

您还需要修改test函数以具有通用参数,否则您不会看到请求的doesn't live long enough错误,因为CCD_ 10错误首先发生。

fn test<'a>() -> Child<'a> {
    let p = Parent;
    p.get_child()
}

在游乐场中试用

最新更新