Как мне объединить строки?
как объединить следующие комбинации типов:
-
strиstr -
Stringиstr -
StringиString
2 ответа:
при объединении строк необходимо выделить память для хранения результата. Проще всего начать с
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спецификатор.) Есть еще один вариант, который потребляет theStringно не требует, чтобы он был изменчивым. Это реализация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, так как я ожидаю, что этот вопрос будет популярен у этой группы!
чтобы объединить несколько строк в одну строку, разделенную другим символом, есть несколько способов.
самое приятное, что я видел, это использование
joinметод на массив:fn main() { let a = "Hello"; let b = "world"; let result = [a, b].join("\n"); print!("{}", result); }в зависимости от вашего варианта использования вы также можете предпочесть более контроль:
fn main() { let a = "Hello"; let b = "world"; let result = format!("{}\n{}", a, b); print!("{}", result); }есть еще несколько ручных способов, которые я видел, некоторые избегают одного или двух распределений здесь и там. Для целей читаемости я считаю, что вышеизложенных двух достаточно.