Что это за синтаксически эта вещь marker: PhantomData
? Я имею в виду, что это не похоже на конструктор, который я бы ожидал, что-то вроде PhantomData{}
или PhantomData()
.
Вы можете определить структуру с нулевым полем, например:
struct Foo;
И создайте его экземпляр следующим образом:
let foo: Foo = Foo;
И тип, и значение имеют имя Foo
.
Для целей отслеживания жизни, заботится ли PhantomData
о фактическом типе в объявлении маркера? Я попытался изменить его на PhantomData<&'a usize>
, и он все еще работал.
В PhantomData
нет ничего особенного, кроме того, что не является ошибкой то, что его аргумент типа не используется (см. the источник ). Это поведение разрешается с помощью атрибута #[lang = "phantom_data"]
, который для этой цели является просто ловушкой в компиляторе.
В объявлении моего метода MyStruct::new()
, если я забуду явно указать 'a
время жизни для аргумента context
, маги c из PhantomData
исчезают, и становится нормально сбросить Context
до MyStruct
. Это довольно коварно; компилятор даже не выдает предупреждение. Какой срок жизни он назначает marker
тогда и почему?
PhantomData
позволяет вам сообщить компилятору информацию о том, что он не может сделать вывод сам, потому что эта информация относится к типу, который вы не используете напрямую. Вы должны предоставить компилятору правильную информацию.
В объявлении моего метода MyStruct::new()
, если я забуду явно указать время жизни 'a
для аргумента context
, Маги c из PhantomData
исчезают, и становится нормально сбросить Context
до MyStruct
. Это довольно коварно; компилятор даже не выдает предупреждение. Какой срок жизни он назначает marker
тогда и почему?
Я не совсем уверен, понимаю ли я этот вопрос. PhantomData
ничего не делает - это просто способ сообщить компилятору, что вы используете данные определенным образом, и вы можете express точно получить эту информацию. Обратите внимание, что даже если вы express неправильно ограничили ограничения, возможно ввести небезопасную память, только если у вас также есть код unsafe
. Правильное выражение времени жизни в PhantomData
является частью создания безопасной абстракции вокруг небезопасного кода.