- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现 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 likePhantomData{}
orPhantomData()
.
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 toPhantomData<&'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 thecontext
argument, the magic ofPhantomData
disappears, and it becomes OK to dropContext
beforeMyStruct
. This is quite insidious; the compiler does not even give a warning. What lifetime does it assign tomarker
then, and why?
PhantomData
是否可以让您告诉编译器信息它无法自行推断,因为该信息是关于您不直接使用的类型的。由您为编译器提供正确的信息。
In the declaration of my
MyStruct::new()
method, if I forget to explicitly specify the'a
lifetime for thecontext
argument, the magic ofPhantomData
disappears, and it becomes OK to dropContext
beforeMyStruct
. This is quite insidious; the compiler does not even give a warning. What lifetime does it assign tomarker
then, and why?
PhantomData
不做任何事情——它只是一种向编译器传达您正在以某种方式使用数据的方式,而准确地表达该信息取决于您。请注意,即使您错误地表达了约束,也只有在您也有
unsafe
时才可能引入内存不安全。代码。在
PhantomData
中正确表达生命周期是围绕不安全代码创建安全抽象的一部分。
关于rust - PhantomData 在 Rust 中究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61308487/
Feel free to skip straight to TL/DR if you're not interested in details of the question 简短的序言: 我最近决定
我一直在阅读 A Tour of Go学习Go-Lang到目前为止一切顺利。 我目前在 Struct Fields类(class),这是右侧的示例代码: package main import "fm
Last time I got confused顺便说一下PowerShell急切地展开集合,基思总结了它的启发式如下: Putting the results (an array) within a
我是一名优秀的程序员,十分优秀!