Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Строки

Теперь давайте разберемся с двумя типами строк в Rust:

  • &str — это срез из байтов в кодировке UTF-8, аналогичный &[u8].
  • String — это владеющий буфер из байтов в кодировке UTF-8, похожий на Vec<T>.
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let s1: &str = "World";
    println!("s1: {s1}");

    let mut s2: String = String::from("Привет ");
    println!("s2: {s2}");

    s2.push_str(s1);
    println!("s2: {s2}");

    let s3: &str = &s2[2..9];
    println!("s3: {s3}");
}
This slide should take about 10 minutes.
  • &str задаёт строковый срез — неизменяемую ссылку на строковые данные в кодировке UTF-8, которые хранятся в блоке памяти. Строковые литералы ("Hello") хранятся в бинарном файле программы.

  • Тип String в Rust — это обёртка над вектором байтов. Как и Vec<T>, он владеет своими данными.

  • Как и многие другие типы, String::from() создаёт строку из строкового литерала; String::new() создаёт новую пустую строку, в которую можно добавлять данные с помощью методов push() и push_str().

  • Макрос format!() — удобный способ создать владеющую строку из динамических значений. Он принимает ту же спецификацию формата, что и println!().

  • Из String можно заимствовать срезы &str через & и, при желании, выбрав диапазон. Если выбрать диапазон байтов, не выровненный по границам символов, выражение вызовет панику. Итератор chars перебирает символы; его лучше использовать, чем пытаться вручную вычислять границы символов.

  • Программистам на C++: думайте о &str как о std::string_view из C++, но который всегда указывает на корректную строку в памяти. String в Rust примерно соответствует std::string из C++ (основное отличие: он может содержать только байты в кодировке UTF-8 и никогда не использует оптимизацию для коротких строк).

  • Байтовые строковые литералы позволяют напрямую создать значение &[u8]:

    // Copyright 2024 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    fn main() {
        println!("{:?}", b"abc");
        println!("{:?}", &[97, 98, 99]);
    }
  • Сырые строки позволяют создавать значение &str с отключенным экранированием: r"\n" == "\\n". Вы можете поставить двойные кавычки, используя равное количество символов # с обеих сторон кавычек:

    // Copyright 2024 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    fn main() {
        println!(r#"<a href="link.html">link</a>"#);
        println!("<a href=\"link.html\">link</a>");
    }