Size: a a a

Rust — русскоговорящее сообщество

2021 June 14

goldstein опять in Rust — русскоговорящее сообщество
Я не могу паниковать без const_panic, не могу сравнить в where без const_evaluatable_checked
источник

goldstein опять in Rust — русскоговорящее сообщество
Вероятно, я могу здесь применить что-то вроде dont-panic, но не хотелось бы
источник

NL

Nikolay Lavrenov in Rust — русскоговорящее сообщество
Как страшно!!!
источник

♚Inojelis in Rust — русскоговорящее сообщество
источник

AZ

Alexander Zaitsev in Rust — русскоговорящее сообщество
получается, что ты токсик
источник

Э

Эрик in Rust — русскоговорящее сообщество
Мы все тут токсики, просто некоторые лучше скрывают.
источник

А⚙

Антон ⚙️ in Rust — русскоговорящее сообщество
Сделай struct SizeProof<T, const SIZE: usize>(PhantomData<(T, SIZE)>) ; и принимай её аргументом там, где требуется равенство размеров. А публичным конструктором сделай тот, который при монофорфизации даёт ошибку:

impl<T, const SIZE: usize> SizeProof<T, SIZE> {
   fn qed() -> Self {
       #[deny(const_err)]
       const _: [(); SIZE] = [(); size_of::<T>()];
       Self(PhantomData)
   }
}
источник

♚Inojelis in Rust — русскоговорящее сообщество
спамеры тоже люди, поэтому любой их ненавистник должен быть провозлашен расиситом и выкинут из группы.
источник

goldstein опять in Rust — русскоговорящее сообщество
Нельзя. Константа это итем, в итемах нельзя использовать дженерик-аргументы из функции.
источник

А⚙

Антон ⚙️ in Rust — русскоговорящее сообщество
Гм
источник

goldstein опять in Rust — русскоговорящее сообщество
Это первое, что я попробовал (и ещё то, что делает крейт static-assertions)
источник

А⚙

Антон ⚙️ in Rust — русскоговорящее сообщество
Странно. Для доказательства того, что тип ZST, у меня сработало: https://t.me/dereference_pointer_there/7
Telegram
Блог*
⬆️⬆️⬆️
А что нам, собственно говоря, нужно? Нам нужно доказательство того, что тип имеет нулевой размер. Доказательство чего-либо можно передать:
1) ограничением на тип (см. Send и Sync);
2) фактом успешного вычисления на этапе компиляции константы (см. static_assert_size);
3) значением специального типа.
Действительно, если тип имеет приватные поля, то единственный способ сконструировать значение этого типа (за вычетом unsafe, разумеется) — это использовать публичную функцию, которая конструирует значение этого типа. Что ж, давайте так и поступим:
pub mod zero_sized {
   use std::marker::PhantomData;
   
   // Доказательство должно быть параметризовано типом,
   // чтобы доказательство для одного типа не могло быть использовано
   // как доказательство другого типа.
   pub struct ZeroSizeProof<T>(PhantomData<T>, ());
   
   pub trait ZeroSized: Sized {
       #[deny(const_err)]
       const I_AM_ZERO_SIZED: ();
       fn proof_zero_size(&self) -> ZeroSizeProof<Self>;
   }

   // опять-таки, blanket…
источник

goldstein опять in Rust — русскоговорящее сообщество
У тебя здесь в типе и значении константы не используются дженерик-аргументы из enclosing function
источник

А⚙

Антон ⚙️ in Rust — русскоговорящее сообщество
Ну да. А у меня не enclosing function, а enclosing impl block
источник

goldstein опять in Rust — русскоговорящее сообщество
А так можно
источник

А⚙

Антон ⚙️ in Rust — русскоговорящее сообщество
Сработало? 🤔
источник

goldstein опять in Rust — русскоговорящее сообщество
Мне обязательно именно функция
источник

goldstein опять in Rust — русскоговорящее сообщество
Я там поставил пока рантаймовый ассерт и забил
Один фиг он соптимизируется в ноль
источник

А⚙

Антон ⚙️ in Rust — русскоговорящее сообщество
А что мешает аргумент с пруфом в функцию добавить?
источник

goldstein опять in Rust — русскоговорящее сообщество
А пруф откуда брать?
источник