PhantomData在Rust中究竟是如何工作的?

PhantomData在Rust中究竟是如何工作的?,rust,ffi,phantom-types,Rust,Ffi,Phantom Types,我发现Rust中的PhantomData的概念相当混乱。我在基于FFI的代码中广泛地使用它来约束对象的生命周期,但我仍然不确定我是否正确地使用了它 这是一个我经常使用它的人为的例子。例如,我不希望MyStruct的实例比Context的实例寿命长: //FFI声明和类型 mod ffi{ 使用std::ffi::c_void; pub类型句柄\u t=*常量c\u void; // ... } //为某些上下文创建和维护的包装器结构 //在C库中 结构上下文{ // ... } //句柄只有在上

我发现Rust中的
PhantomData
的概念相当混乱。我在基于FFI的代码中广泛地使用它来约束对象的生命周期,但我仍然不确定我是否正确地使用了它

这是一个我经常使用它的人为的例子。例如,我不希望
MyStruct
的实例比
Context
的实例寿命长:

//FFI声明和类型
mod ffi{
使用std::ffi::c_void;
pub类型句柄\u t=*常量c\u void;
// ...
}
//为某些上下文创建和维护的包装器结构
//在C库中
结构上下文{
// ...
}
//句柄只有在上下文处于活动状态时才有效。
//因此,我使用PhantomData标记来约束其生存期。
结构MyStruct,
handle:ffi::handle\u t,
}
恳求{
fn新(上下文:&'a上下文)->Self{
let handle:ffi::handle\u t=context.new\u handle();
我的结构{
标记:幻影数据,
手柄
}
}
}
fn main(){
//在C库中的某个地方初始化上下文
让ctx=Context::new(不安全的{ffi::create_Context()});
//创建MyStruct的实例
让my_struct=MyStruct::new(&ctx);
// ...
}
我不太明白以下几点:

  • 这个
    标记:PhantomData
    东西在语法上到底是什么?我的意思是,它看起来不像一个构造函数,我希望它像
    PhantomData{}
    PhantomData()

  • 出于生命周期跟踪的目的,
    PhantomData
    是否关心
    marker
    声明中的实际类型?我试着把它改成
    PhantomData
    这个
    标记:PhantomData
    东西在语法上到底是什么?我的意思是,它看起来不像一个构造函数,我希望它像
    PhantomData{}
    PhantomData()

    您可以定义零字段结构,如下所示:

    struct Foo;
    
    let foo: Foo = Foo;
    
    并创建一个这样的实例:

    struct Foo;
    
    let foo: Foo = Foo;
    
    类型和值都命名为
    Foo


    就生命周期跟踪而言,
    PhantomData
    是否关心标记声明中的实际类型?我试着把它改成
    PhantomData这个问题中的问题太多了。@mcarton我觉得这些问题源于对
    PhantomData
    实际上是什么的一个严重误解,所以我把它们都放在一个问题中,我不知道零字段结构的语法,所以“
    标记:PhantomData
    ”在我看来,这是一种“特殊”的语法,我认为
    PhantomData
    某种程度上是在编译器级别上运行的。现在我看到它更简单和明显。谢谢