Веб-версияОткрыть в Telegram

Пост🤠 Трюк Индианы Джонса: std::mem::take

9 сентября 2026
R
Rust
🤠 Трюк Индианы Джонса: std::mem::take Типичная ситуация: у вас есть &mut self, и вы хотите забрать поле (например, String или Vec), что-то с ним сделать, и, возможно, вернуть обратно или сохранить измененную версию. Компилятор бьет по рукам: нельзя просто так переместить (move) значение из-за мутабельной ссылки. Новички часто делают .clone(), чтобы успокоить borrow checker. Но это лишняя аллокация! Решение: std::mem::take. Оно забирает значение из ссылки, оставляя на его месте Default::default(). struct Buffer { data: Vec<u8>, } impl Buffer { fn process(&mut self) { // Мы "выкрадываем" вектор. // В self.data теперь пустой Vec (без аллокаций). let raw_data = std::mem::take(&mut self.data); // Тяжелая обработка в другом потоке/функции, // требующая владения (ownership) let processed = heavy_transform(raw_data); // Возвращаем результат self.data = processed; } } Это работает для всего, что реализует Default (Option, String, Vec). Для типов без Default есть std::mem::replace. Это zero-cost, семантически верно и намного быстрее клонирования. #rust #std #optimization #tips 📲 Мы в MAX 👉 @rust_lib
12 · 813 ·

Рядом в ленте

RRustВладение, заимствование и ссылки в Rust: как компилятор делает ваш код безопасным В Rust одна из самых непривычных для разработчиков тем — это ownership (владенRRust🐮 Cow: Ленивое клонирование Все знают: лишний clone() - это грех. Но иногда нам нужно вернуть строку, которая может быть изменена, а может и нет. Допустим, мы ч
это сообщение
RRustПочему Vec::new() это ловушка для производительности. 📈 Векторный рост: Избегаем реаллокаций Мы часто пишем: let mut vec = Vec::new(); for item in heavy_iter {

Открытая публичная лента из поискового индекса ChatCrawler — «Google по публичному Telegram»; обновляется по мере обхода площадки. Время — UTC.

Только публичный контент, официальный API Telegram. О проекте · Вопросы · Чего мы не делаем · Убрать страницу из выдачи · Каталог · Поиск · Как мы считаем