gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:24:42 31 4
gpt4 key购买 nike

我发现 PhantomData 的概念在 Rust 中相当困惑。我在基于 FFI 的代码中广泛使用它来限制对象的生命周期,但我仍然不确定我是否正确地执行了此操作。

这是我经常最终使用它的人为示例。例如,我不想要 MyStruct 的实例。比 Context 的实例生命周期更长:

// FFI declarations and types
mod ffi {
use std::ffi::c_void;
pub type handle_t = *const c_void;
// ...
}

// A wrapper structure for some context created and maintained
// inside the C library
struct Context {
// ...
}

// Handle is only valid as long as the Context is alive.
// Hence, I use the PhantomData marker to constrain its lifetime.
struct MyStruct<'a> {
marker: PhantomData<&'a Context>,
handle: ffi::handle_t,
}

impl<'a> MyStruct<'a> {
fn new(context: &'a Context) -> Self {
let handle: ffi::handle_t = context.new_handle();
MyStruct {
marker: PhantomData,
handle
}
}
}

fn main() {
// Initialize the context somewhere inside the C library
let ctx = Context::new(unsafe {ffi::create_context()});

// Create an instance of MyStruct
let my_struct = MyStruct::new(&ctx);

// ...
}

我不太明白以下内容:
  • 这到底是什么marker: PhantomData东西,在语法上?我的意思是,它看起来不像构造函数,我希望它类似于 PhantomData{}PhantomData() .
  • 出于生命周期跟踪的目的,PhantomData甚至关心 marker 声明中的实际类型?我尝试将其更改为 PhantomData<&'a usize> ,它仍然有效。
  • 在我的 MyStruct::new() 的声明中方法,如果我忘记明确指定 'a context 的生命周期论点,PhantomData 的魔力消失,放下Context就OK了之前 MyStruct .这是相当阴险的;编译器甚至没有给出警告。它分配给 marker 的生命周期是多少?那么,为什么?
  • 与上一个问题相关;如果有多个输入引用参数可能具有不同的生命周期,PhantomData 如何确定使用哪个生命周期?
  • 最佳答案

    What exactly is this marker: PhantomData thing, syntactically? I mean, it does not look like a constructor, which I'd expect to be something like PhantomData{} or PhantomData().



    您可以定义一个零字段结构,如下所示:
    struct Foo;

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

    类型和值都命名为 Foo .

    For the purposes of lifetime tracking, does PhantomData even care about the actual type in the declaration of marker? I tried changing it to PhantomData<&'a usize>, and it still worked.


    PhantomData 没有什么特别之处除了未使用其类型参数不是错误(参见 the source )。此行为通过 #[lang = "phantom_data"] 启用。属性,这只是为此目的在编译器中的一个钩子(Hook)。

    In the declaration of my MyStruct::new() method, if I forget to explicitly specify the 'a lifetime for the context argument, the magic of PhantomData disappears, and it becomes OK to drop Context before MyStruct. This is quite insidious; the compiler does not even give a warning. What lifetime does it assign to marker then, and why?


    PhantomData是否可以让您告诉编译器信息它无法自行推断,因为该信息是关于您不直接使用的类型的。由您为编译器提供正确的信息。

    In the declaration of my MyStruct::new() method, if I forget to explicitly specify the 'a lifetime for the context argument, the magic of PhantomData disappears, and it becomes OK to drop Context before MyStruct. This is quite insidious; the compiler does not even give a warning. What lifetime does it assign to marker then, and why?



    我不完全确定我是否理解这个问题。 PhantomData不做任何事情——它只是一种向编译器传达您正在以某种方式使用数据的方式,而准确地表达该信息取决于您。请注意,即使您错误地表达了约束,也只有在您也有 unsafe 时才可能引入内存不安全。代码。在 PhantomData 中正确表达生命周期是围绕不安全代码创建安全抽象的一部分。

    关于rust - PhantomData 在 Rust 中究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61308487/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com