Блог*
#prog #rust Очередное напоминание, что Rust не является просто улучшенным C и что ссылки не являются просто продвинутой версией указателей. Рассмотрим вот такой код, полностью нормальный с точки зрения сишника: fn main() { let a: [i32; 2] = [0, 1];…
#prog #rust
И ещё пример, когда это может выстрелить. Пусть у нас есть вот такой вот код для того, чтобы вынимать несколько элементов из вектора за раз:
Дело в том, что
TL;DR: не используйте конец диапазона, возвращённый
И ещё пример, когда это может выстрелить. Пусть у нас есть вот такой вот код для того, чтобы вынимать несколько элементов из вектора за раз:
fn pop_many<T, const N: usize>(arr: &mut Vec<T>) -> Option<[T; N]> {
let Some(new_len) = arr.len().checked_sub(N) else {
return None;
};
let mut ret = std::mem::MaybeUninit::<[T; N]>::uninit();
unsafe {
arr.set_len(new_len);
std::ptr::copy_nonoverlapping(
arr.as_ptr().add(new_len),
ret.as_mut_ptr().cast(),
N,
);
Some(ret.assume_init())
}
}
Достаточно прямолинейный код, на который не ругается miri (можете сами проверить). У кого-то может возникнуть мысль, что для лучше документированности кода можно использовать метод, который подчёркивает, что используется конец инициализированной части кода: ...
std::ptr::copy_nonoverlapping(
arr.as_ptr_range().end,
ret.as_mut_ptr().cast(),
N
);
...
Ииии этот код не работает... В том смысле, что если его проверить на, скажем, таком примере:let mut v = vec![1, 2, 3];
let [_, _] = pop_many(&mut v).unwrap();
, то miri выдаёт ошибку. Почему?Дело в том, что
as_ptr_range
(возвращающий Range<*const T>
, к слову) — это метод не на векторе, а на слайсе, который вызывается тут за счёт deref coercion. Промежуточным этапом при вызове является создание &[T]
— и ссылка даёт право использовать образованные от неё указатели только в рамках памяти, на которую эта ссылка указывает. В частности, это означает, что сделать указатель за конец этого слайса можно, но вот использовать его для доступа к следующей за этим слайсом неинициализированной части вектора нельзя.TL;DR: не используйте конец диапазона, возвращённый
.as_ptr_range()
на векторе, для доступа к его неинициализированной части. Если уж так сильно хочется не использовать арифметику — можно использоватьvec.spare_capacity_mut().as_ptr().cast()
👍8
Блог*
#music Что удивительно, это единственный трек Foo Fighters, который мне зашёл. youtu.be/SBjQ9tuuTJQ
🌚6
Блог*
— Их сослали в ад? — Хуже, в Висконсин.
"Метатрон" звучит не как имя ангела, а как имя персонажа из вселенной Трансформеров
👍9
#prog #rust #rustlib #menacingopensource
gpt-macro — ChatGPT powered Rust proc macro that generates code at compile-time.
gpt-macro — ChatGPT powered Rust proc macro that generates code at compile-time.
GitHub
GitHub - retrage/gpt-macro: ChatGPT powered Rust proc macro that generates code at compile-time.
ChatGPT powered Rust proc macro that generates code at compile-time. - retrage/gpt-macro
😁11💩4🤡2🤮1
Я за равноправие полов.
Хентай с тентаклями должен быть и с мужчинами.
Хентай с тентаклями должен быть и с мужчинами.
❤14👎7🤡4👍3🤯1🍌1
У меня нет второй половинки, даже не смотря на то, что я придерживаюсь оптимальной стратегии: ничего не делать и ждать, пока significant other не упадёт самостоятельно мне на голову.
😁13👍7
#gamedev #article
Алексис Кеннеди рассказывает о истории создания Cultist simulator. Увлекательно и немного с юмором.
В конце предостерегает других инди-разработчиков от использования истории успеха Cultist simulator для оценки своих проектов, так как он считает, что ему очень сильно повезло.
Часть 1
Часть 2
Часть 3
Часть 4
Часть 5
Часть 6
Алексис Кеннеди рассказывает о истории создания Cultist simulator. Увлекательно и немного с юмором.
В конце предостерегает других инди-разработчиков от использования истории успеха Cultist simulator для оценки своих проектов, так как он считает, что ему очень сильно повезло.
Часть 1
Часть 2
Часть 3
Часть 4
Часть 5
Часть 6
Medium
Alexis Kennedy on the Cultist Simulator: The Way through the Wood, Part 1
On 25th May 2016, the day I left Failbetter, I made my last ever post on the company blog:
❤2👍1🔥1
Кажется, пассивное "решение" не заводить аккаунт в Твиттере было одно из самых полезных для моего ментального здоровья решений в жизни
💯17❤3👍1