
Вы неправильно используете clone() в Rust
badcasedaily1 14 минут назад Вы неправильно используете clone() в Rust Уровень сложности Средний Время на прочтение 5 мин Охват и читатели 263 Блог компании OTUS Rust * Программирование * Туториал Материал подготовлен в...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. badcasedaily1 14 минут назад Вы неправильно используете clone() в Rust Уровень сложности Средний Время на прочтение 5 мин Охват и читатели 263 Блог компании OTUS Rust * Программирование * Туториал Материал подготовлен в рамках курса «Rust-разработчик. Продвинутый уровень» . Когда borrow checker не пропускает код, самое простое решение: добавить .
Компилятор доволен, код работает. Но вот незадача, что clone() в таком сценарии не решает проблему, а прячет её. Borrow checker сказал, что с владением что‑то не так, а вы вместо исправления просто скопировали данные.
Технические детали
Через полгода в проекте десятки clone() , каждый из которых аллоцирует, и профилировщик показывает, что заметная часть времени уходит на копирование строк. Clone чтобы угодить borrow checker fn process(data: &mut Vec ) { for item in data. clone() { // clone всего вектора!
starts_with("error") { data. ("found: {}", item)); } } } Borrow checker не даёт итерироваться по data и одновременно его мутировать. Разработчик клонирует весь вектор.
Если в data тысяча строк, это тысяча аллокаций на пустом месте. Решение простое: собрать результат отдельно и добавить после цикла. fn process(data: &mut Vec ) { let new_items: Vec = data.
Отраслевые последствия
starts_with("error")) . ("found: {}", item)) . extend(new_items); } Одна аллокация на новый вектор вместо копирования всего старого.
String вместо &str в сигнатуре fn connect(url: String) { /* ... */ } fn main() { let config = load_config(); connect(config. clone()); // clone, потому что config нужен дальше println!
api_key); } Функция connect принимает String по значению, хотя внутри, скорее всего, только читает URL. Clone появляется из‑за того, что API требует владения, хотя ему достаточно ссылки. fn connect(url: &str) { /* ...
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





