Вопрос проверяет понимание управления памятью в Rust и способов избежать лишних аллокаций при передаче строк в функции.
В Rust строки типа String хранятся в куче, и передача их по значению в функцию приводит к перемещению (move), после чего исходная переменная становится недоступной. Если функция должна добавить данные к строке, перемещение вынуждает либо возвращать новую строку (что создаёт новую аллокацию), либо использовать клонирование (что также выделяет память). Это неэффективно, особенно при частых операциях.
Используйте изменяемую ссылку (&mut String). Это позволяет функции напрямую изменять исходную строку без перемещения или копирования. Например:
fn append_str(s: &mut String, add: &str) {
s.push_str(add);
}
fn main() {
let mut my_string = String::from("Hello");
append_str(&mut my_string, ", world!");
println!("{}", my_string); // Hello, world!
}Здесь &mut my_string передаёт изменяемую ссылку, и функция использует push_str, который добавляет данные без дополнительных аллокаций (если ёмкость достаточна).
Такой подход применяется в циклах, где нужно накапливать строку, или в парсерах, где требуется модифицировать буфер. Он экономит память и повышает производительность, избегая лишних копирований.
Используйте &mut String для передачи строки в функцию, если нужно её изменить, чтобы избежать лишних аллокаций и сохранить владение в вызывающем коде. Это стандартный идиоматичный способ работы с изменяемыми данными в Rust.