Если я перестал хвалить Rust — я или умер, или попал в военкомат (что, в принципе, одно и то же)
😢33😁7🤔3
События последних дней таки догнали мою психику. Разрыдался.
И, кажется, у меня нервный тик.
И, кажется, у меня нервный тик.
😢37❤4😁2
Блог*
Сделаем слайс по частям и превратим: const DECOMPOSED: ([u8; 20], usize) = to_ascii(42); const STR: &str = unsafe { std::mem::transmute(RawSlice { ptr: &DECOMPOSED.0 as *const _, // &[u8] неявно приводится к *const [u8], …
#prog #rust #моё
"Вижу цель — не вижу препятствий", или о превратностях туннельного зрения.
Даже после точного подсчёта размера буфера
Переписал гист.
"Вижу цель — не вижу препятствий", или о превратностях туннельного зрения.
Даже после точного подсчёта размера буфера
to_ascii возвращает пару из буфера и размера записанной части. Но зачем? Буфер уже в точности того размера, который нужен — LEN! Значит, можно просто возвращать Array и не считать len, тем самым упростив код.Переписал гист.
👍1
Блог*
#prog #rust #моё "Вижу цель — не вижу препятствий", или о превратностях туннельного зрения. Даже после точного подсчёта размера буфера to_ascii возвращает пару из буфера и размера записанной части. Но зачем? Буфер уже в точности того размера, который нужен…
#prog #rust
То есть, согласно miri,
Но: также согласно miri, тот же самый код, но в const-контексте,
И при этом, согласно всё тому же miri, если убрать
Короче, я тут так лихо отредактировал, что умудрился написать код, который вроде ок в const-контексте, но при этом вызывает UB в рантайме. Ещё раз поправил гист, теперь вроде висячих ссылок нету.
То есть, согласно miri,
let s_rt: &[u8] = unsafe {
std::slice::from_raw_parts(
std::convert::identity([0]).as_ptr(),
1,
)
};
— это не ок, потому что тут создаётся висячая ссылка. Логично, значение, возвращаемое identity, дохнет после вызова функции.Но: также согласно miri, тот же самый код, но в const-контексте,
const S_CONST: &[u8] = unsafe {
std::slice::from_raw_parts(
std::convert::identity([0]).as_ptr(),
1,
)
};
— это ок, тут никаких висящих ссылок нет. Потому что, тут, видимо, значение, возвращаемое константной identity, вызвано на константном значении и потому само является константным и может быть использовано для static promotion? Даже не смотря на отсутствие на identity атрибута #[rustc_promotable], поскольку возвращаемое значение не является непосредственно promotable значением и вычисляется внутри инициализатора константы?И при этом, согласно всё тому же miri, если убрать
identity:let s_rt: &[u8] = unsafe {
std::slice::from_raw_parts([0].as_ptr(), 1)
};
, то всё ок и никаких висячих ссылок нету? Потому что [0] промоутится? А, нет, потому что это &[u8], но не &'static [u8], если поменять тип s_rt, тогда miri жалуется.Короче, я тут так лихо отредактировал, что умудрился написать код, который вроде ок в const-контексте, но при этом вызывает UB в рантайме. Ещё раз поправил гист, теперь вроде висячих ссылок нету.
GitHub
const-eval/promotion.md at master · rust-lang/const-eval
home for proposals in and around compile-time function evaluation - const-eval/promotion.md at master · rust-lang/const-eval
👏2
Если растаману отрубить голову, он ещё пять минут будет говорить о преимуществах borrow checker-а
👍22😁4🌚3❤1
Блог*
#prog #rust #моё "Вижу цель — не вижу препятствий", или о превратностях туннельного зрения. Даже после точного подсчёта размера буфера to_ascii возвращает пару из буфера и размера записанной части. Но зачем? Буфер уже в точности того размера, который нужен…
Более того, зная наперёд количество цифр, мы можем заполнять массив с конца, чтобы строка получилась сразу в правильном порядке, а не оборачивать его в конце!
Ещё раз обновил гист.
Ещё раз обновил гист.
🔥1😁1
Блог*
Более того, зная наперёд количество цифр, мы можем заполнять массив с конца, чтобы строка получилась сразу в правильном порядке, а не оборачивать его в конце! Ещё раз обновил гист.
А ещё я забыл, что ссылка на массив приводится к ссылке на слайс. Следовательно, раз у меня длина точная, мне не нужна
Обновил гист. Опять.
Ощущаю себя невероятно тупым.
std::slice::from_raw_parts в const-контексте, а достаточно std::str::from_utf8_unchecked, которая была стабилизирована в const-контексте ещё в Rust 1.55.0, год назад, что я сейчас и проверил только что на godbolt.Обновил гист. Опять.
Ощущаю себя невероятно тупым.
Telegram
Блог*
#prog #rust #rustreleasenotes
Новый релиз Rust — уже 1.55.0! — и мой новый разбор избранных кусков новых фич.
Теперь в качестве паттернов можно использовать диапазоны с открытой верхней границей:
match x as u32 {
0 => println!("zero!"),
1..…
Новый релиз Rust — уже 1.55.0! — и мой новый разбор избранных кусков новых фич.
Теперь в качестве паттернов можно использовать диапазоны с открытой верхней границей:
match x as u32 {
0 => println!("zero!"),
1..…
👍1😁1