Как объединить следующие комбинации типов:
str
иstr
String
иstr
String
иString
string
rust
string-concatenation
jsalter
источник
источник
str
и&str
это разные типы и в 99% случаев вам нужно только позаботиться&str
. Есть и другие вопросы, детализирующие различия между ними.Ответы:
Когда вы объединяете строки, вам нужно выделить память для хранения результата. Проще всего начать с
String
и&str
:Здесь у нас есть собственная строка, которую мы можем изменить. Это эффективно, поскольку потенциально позволяет нам повторно использовать выделение памяти. Там аналогичный случай для
String
иString
, как&String
можно разыменовать как&str
.После этого
another_owned_string
остается нетронутым (примечание безmut
уточнения). Там еще один вариант , который потребляетString
, но не требует от него быть изменяемыми. Это реализацияAdd
черты, которая принимаетString
как левую сторону, а&str
как правую:Обратите внимание, что
owned_string
больше не доступно после звонка+
.Что если мы хотим создать новую строку, оставив обе нетронутыми? Самый простой способ - использовать
format!
:Обратите внимание, что обе входные переменные являются неизменяемыми, поэтому мы знаем, что они не затрагиваются. Если мы хотим сделать то же самое для любой комбинации
String
, мы можем использовать тот факт, чтоString
также может быть отформатирован:Вы не должны использовать
format!
все же. Вы можете клонировать одну строку и добавить другую строку к новой строке:Примечание: все спецификации типов, которые я сделал, являются избыточными - компилятор может вывести здесь все типы в игре. Я добавил их просто для ясности новичкам в Rust, так как я ожидаю, что этот вопрос будет популярен в этой группе!
источник
Add
/+
символ? Вы можете покрыть это, если хотите..to_owned()
и.to_string()
было исправлено с момента вышеупомянутого комментария благодаря подразумеваемой специализации. Теперь они оба имеют одинаковую производительность при вызове&str
. Соответствующий коммит: github.com/rust-lang/rust/pull/32586/filesЧтобы объединить несколько строк в одну строку, разделенную другим символом, существует несколько способов.
Самое приятное, что я видел, это использование
join
метода в массиве:В зависимости от вашего варианта использования вы также можете предпочесть больше контроля:
Я видел еще несколько ручных способов, некоторые избегают одного или двух распределений здесь и там. Для удобства чтения я считаю, что вышеупомянутых двух будет достаточно.
источник
join
документировано? Кажется, он находится на полпути между массивом и строкой. Я искал документацию по массиву и быстро растерялся.join
на самом деле привязан к этойSliceContactExt
черте . Черта помечена как нестабильная, но ее методы стабильны и включены в Prelude, поэтому по умолчанию их можно использовать везде. Команда, кажется, хорошо знает, что эта черта не должна существовать, и я думаю, что в будущем все изменится.Я думаю, что этот
concat
метод и+
должен быть упомянут здесь также:и есть также
concat!
макрос, но только для литералов:источник
+
уже упоминалось в существующем ответе . ( Это реализацияAdd
признака , который принимает вString
качестве стороны левой стороны , и&str
как с правой стороны: )Простые способы объединения строк в RUST
В RUST доступны различные методы для объединения строк
Первый способ (Использование
concat!()
):Вывод вышеуказанного кода:
Второй метод (использование
push_str()
и+
оператор):Вывод вышеуказанного кода:
Третий метод (
Using format!()
):Вывод вышеуказанного кода:
проверить это и поэкспериментировать с игровой площадкой Rust
источник