Ответ 1
Когда вы объединяете строки, вам нужно выделить память для хранения результата. Проще всего начать с String
и &str
:
fn main() {
let mut owned_string: String = "hello ".to_owned();
let borrowed_string: &str = "world";
owned_string.push_str(borrowed_string);
println!("{}", owned_string);
}
Здесь у нас есть собственная строка, которую мы можем изменить. Это эффективно, поскольку потенциально позволяет нам повторно использовать выделение памяти. Существует аналогичный случай для String
и String
, так как &String
может быть разыменовано как &str
.
fn main() {
let mut owned_string: String = "hello ".to_owned();
let another_owned_string: String = "world".to_owned();
owned_string.push_str(&another_owned_string);
println!("{}", owned_string);
}
После этого another_owned_string
остается нетронутым (обратите внимание, что нет mut
). Есть другой вариант, который потребляет String
но не требует, чтобы она была изменяемой. Это rel=noreferrer>реализация черты Add
которая принимает String
в качестве левой стороны и a &str
в качестве правой стороны:
fn main() {
let owned_string: String = "hello ".to_owned();
let borrowed_string: &str = "world";
let new_owned_string = owned_string + borrowed_string;
println!("{}", new_owned_string);
}
Обратите внимание, что owned_string
больше не доступен после вызова +
.
Что, если мы хотим создать новую строку, оставив обе нетронутыми? Самый простой способ - использовать format!
:
fn main() {
let borrowed_string: &str = "hello ";
let another_borrowed_string: &str = "world";
let together = format!("{}{}", borrowed_string, another_borrowed_string);
println!("{}", together);
}
Обратите внимание, что обе входные переменные являются неизменяемыми, поэтому мы знаем, что они не затрагиваются. Если мы хотим сделать то же самое для любой комбинации String
, мы можем использовать тот факт, что String
также может быть отформатирован:
fn main() {
let owned_string: String = "hello ".to_owned();
let another_owned_string: String = "world".to_owned();
let together = format!("{}{}", owned_string, another_owned_string);
println!("{}", together);
}
Вам не нужно использовать format!
хоть. Вы можете клонировать одну строку и добавить другую строку к новой строке:
fn main() {
let owned_string: String = "hello ".to_owned();
let borrowed_string: &str = "world";
let together = owned_string.clone() + borrowed_string;
println!("{}", together);
}
Обратите внимание - все спецификации типов, которые я сделал, являются избыточными - компилятор может вывести здесь все типы в игре. Я добавил их просто, чтобы они были понятны новичкам в Rust, так как я ожидаю, что этот вопрос будет популярен в этой группе!