Как мне объединить строки?
как объединить следующие комбинации типов:
-
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); }
есть еще несколько ручных способов, которые я видел, некоторые избегают одного или двух распределений здесь и там. Для целей читаемости я считаю, что вышеизложенных двух достаточно.