Рядки

Тепер ми можемо зрозуміти два типи рядків у Rust:

  • &str is a slice of UTF-8 encoded bytes, similar to &[u8].
  • String is an owned buffer of UTF-8 encoded bytes, similar to Vec<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}");
}
This slide should take about 10 minutes.
  • &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++, але такий, що завжди вказує на дійсний рядок у пам'яті. Rust String є приблизним еквівалентом 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>");
    }