букавок в коде напечатали? какая практическая польза?
https://doc.rust-lang.org/nomicon/phantom-data.html
дак оттуда и скопировал, но там нет ответа зачем - просто констатация факта, что такая фигня есть
Мне один раз пригодилось, когда я хотел сделать generic структуру, но не хотел хранить экземпляр этого дженерика
мне кажется это можно было бы решить другим способом, можно пример? никак не могу придумать практический способ это использовать
Variance задавать у дженерика, соответствующая тема есть в номиконе
struct Bus<T> where T: IntegrityCheck { pin1: Pin, pin2: Pin, t: PhantomData<T>, } Можно было в каждой функции писать этот дженерик, но, как мне кажется, это не очень удобно Я так понял, PhantomData это как подсказка для компилятора, и по сути не имеет оверхеда
Там же пример есть: struct Iter<'a, T: 'a> { ptr: *const T, end: *const T, } В данном коде ты будешь ожидать что твой Т будет жить столько же сколько и Iter. Но это не так. Поэтому мы помечаем его так struct Iter<'a, T: 'a> { ptr: *const T, end: *const T, _marker: marker::PhantomData<&'a T>, } Время жизни будет ограничено, и ваш итератор будет ковариантным относительно 'aи T
Чтобы добавить, например, лайфтайм дженерики структуре, содержащий сырые указатели
Обсуждают сегодня