Рядки
Тепер ми можемо зрозуміти два типи рядків у Rust:
&str
is a slice of UTF-8 encoded bytes, similar to&[u8]
.String
is an owned buffer of UTF-8 encoded bytes, similar toVec<T>
.
fn main() { let s1: &str = "Світ"; println!("s1: {s1}"); let mut s2: String = String::from("Привіт "); println!("s2: {s2}"); s2.push_str(s1); println!("s2: {s2}"); let s3: &str = &s2[s2.len() - s1.len()..]; println!("s3: {s3}"); }
-
&str
представляє зріз рядка, який є незмінним посиланням на дані рядка в кодуванні UTF-8, що зберігаються в блоці пам’яті. Рядкові літерали ("Hello"
) зберігаються у бінарному файлі програми. -
Тип
String
в Rust — це оболонка навколо вектора байтів. Як і у випадку зVec<T>
, він знаходиться у володінні. -
Як і у багатьох інших типів,
String::from()
створює рядок із рядкового літералу;String::new()
створює новий порожній рядок, до якого дані рядка можна додати за допомогою методівpush()
іpush_str()
. -
Макрос
format!()
є зручним способом створення рядка, яким володіють, з динамічних значень. Він приймає таку саму специфікацію формату, як іprintln!()
. -
Ви можете запозичувати зрізки
&str
зString
за допомогою&
і, за бажанням, вибору діапазону. Якщо ви виберете діапазон байт, який не вирівняно за межами символів, вираз запанікує. Ітераторchars
перебирає символи, і йому надається перевага перед спробами вирівняти межі символів. -
Для програмістів на C++: думайте про
&str
як проstd::string_view
з C++, але такий, що завжди вказує на дійсний рядок у пам'яті. RustString
є приблизним еквівалентомstd::string
з C++ (головна відмінність: він може містити лише байти у кодуванні UTF-8 і ніколи не використовує оптимізацію малих рядків).. -
Літерали байтових рядків дозволяють створювати значення
&[u8]
безпосередньо:fn main() { println!("{:?}", b"abc"); println!("{:?}", &[97, 98, 99]); }
-
Необроблені рядки дозволяють створювати значення
&str
з відключеним екрануванням:r"\n" == "\\n"
. Ви можете вставити подвійні лапки, використовуючи однакову кількість#
з обох боків лапок:fn main() { println!(r#"<a href="link.html">link</a>"#); println!("<a href=\"link.html\">link</a>"); }