当前位置:  开发笔记 > 后端 > 正文

如何强制实施父子结构生命周期?

如何解决《如何强制实施父子结构生命周期?》经验,为你挑选了1个好方法。

我正在为外部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();
}

oli_obk.. 8

你有正确的想法PhantomData.您可以添加生命周期参数和PhantomData字段Child.该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错误,因为Child needs a lifetime错误首先发生.

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

在游乐场试试吧



1> oli_obk..:

你有正确的想法PhantomData.您可以添加生命周期参数和PhantomData字段Child.该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错误,因为Child needs a lifetime错误首先发生.

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

在游乐场试试吧

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有