Строки
Теперь давайте разберемся с двумя типами строк в 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}");
}
-
&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>"); }