Как мне объединить строки?


как объединить следующие комбинации типов:

  • str и str
  • String и str
  • String и String
2 84

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 спецификатор.) Есть еще один вариант, который потребляет the String но не требует, чтобы он был изменчивым. Это реализация 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);
}

есть еще несколько ручных способов, которые я видел, некоторые избегают одного или двух распределений здесь и там. Для целей читаемости я считаю, что вышеизложенных двух достаточно.