Тип PhantomData
Тип PhantomData - это маркерный тип с нулевым размером, который используется в обобщённых структурах для сообщения компилятору о том, что структура логически владеет или ссылается на данные типа T, даже если физически они не хранятся. Параметром тип принимает обобщённый тип T, который указывает, каким типом данных структура якобы владеет. Это важно для корректной работы проверки времен жизни, автоматической реализации трейтов и ковариантности.
Синтаксис
use std::marker::PhantomData;
struct MyStruct<T>
{
data: PhantomData<T>,
}
Пример
Давайте создадим структуру, которая логически владеет типом T, но не хранит его значений:
use std::marker::PhantomData;
struct Owner<T>
{
marker: PhantomData<T>,
}
fn main()
{
let owner: Owner<String> = Owner { marker: PhantomData };
println!("{:?}", owner.marker);
}
Результат выполнения кода:
PhantomData<String>
Пример
Давайте проверим размер структуры с PhantomData - он должен быть равен нулю:
use std::marker::PhantomData;
struct Marker<T>
{
value: PhantomData<T>,
}
fn main()
{
println!("{}", std::mem::size_of::<Marker<u64>>());
println!("{}", std::mem::size_of::<PhantomData<String>>());
}
Результат выполнения кода:
0
0
Пример
Давайте используем PhantomData для хранения идентификатора и связанного с ним типа данных без реального хранения значения:
use std::marker::PhantomData;
struct Id<T>
{
value: u32,
marker: PhantomData<T>,
}
impl<T> Id<T>
{
fn new(value: u32) -> Self
{
Id { value, marker: PhantomData }
}
}
fn main()
{
let id: Id<String> = Id::new(42);
println!("{}", id.value);
}
Результат выполнения кода:
42
Смотрите также
-
тип
impl Trait,
который позволяет возвращать абстрактные типы из функций -
тип
dyn,
который используется для динамической диспетчеризации трейтов -
тип
reference,
который представляет неизменяемую ссылку на данные -
тип
never,
который обозначает тип, не имеющий значений