T" as на самом деле разыменовывает указатель на слайс, чтобы получить указатель на первый элемент слайса?
as это не рантаймовая операция А разыменование- рантаймовая операция
О, так лучше, спасибо.
Забыл сказать что это не рантаймовая операция в данном случае
as получается работает не как отдельная "функция", а мол говорит, что надо просто "воспринимать T так, как указано типом после as"? а то не очень понимаю как это может быть не рантайм
Здесь человек говорил о разыменовании, хотя здесь не происходит разыменования
Ну я про то, что делаешь as и оно по сути уже на другой адрес указывает, странное. Ну и ещё вот это непонятно: error[E0606]: casting `*const [u8]` as `usize` is invalid --> src/main.rs:6:14 | 6 | let p1 = s as *const[u8] as usize; | ^^^^^^^^^^^^^^^^^^^^^^^^ | = help: cast through a thin pointer first
*const [u8] это fat pointer он содержит ссылку на данные и длину нужно сначала получить ссылку на данные преобразованием к *const u8, потом уже каст к usize
я даже, наверное, понял почему для меня это запутанно было на уровне синтаксиса что fat что thin указатели выглядят одинаково, но при этом на уровне семантики - разные хотя, даже на уровне синтаксиса можно различить - получается что fat указатели можно отличить от thin указателей тем, что thin указатели образуются только !Sized типов или любых ссылок, так как они всегда !Sized, я прав? эх, простите душу грешную, что новичковыми глазами полез в дебри низкоуровневые))
если ты в ансейф не лезешь тебе скорее всего и не понадобятся такие подробности
мне просто интересны все эти вещи, я даже по этому поводу поступил на системное программирование, но там особо такому не учат)) интересно как это на уровне типобезопасного языка реализовано, да и в принципе на какие грабли можно наступить
У типов, которые имплементят Thin (Pointee<Metadata = ()>), метаданные zero-sized при хранении поинтера на них, а так разницы нет. Сейчас fat могут быть только указатели на слайсы, str (как разновидность слайсов на самом деле), dyn Trait, и DST (последние содержат [T]/str/dyn Trait в качестве последнего поля и наследуют их метадату). Правда, что только !Sized могут быть fat, но не факт, что на любой !Sized pointer будет толстым. extern type например.
Обсуждают сегодня