我正在为外部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();
}
答案 0 :(得分: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()
}