String

String — це розширюваний рядок у кодуванні UTF-8:

fn main() {
    let mut s1 = String::new();
    s1.push_str("Привіт");
    println!("s1: len = {}, capacity = {}", s1.len(), s1.capacity());

    let mut s2 = String::with_capacity(s1.len() + 1);
    s2.push_str(&s1);
    s2.push('!');
    println!("s2: len = {}, capacity = {}", s2.len(), s2.capacity());

    let s3 = String::from("🇨🇭");
    println!("s3: len = {}, number of chars = {}", s3.len(), s3.chars().count());
}

String реалізує Deref<Target = str>, що означає, що ви можете викликати усі методи str у String.

This slide should take about 5 minutes.
  • String::new повертає новий порожній рядок. Використовуйте String::with_capacity, якщо ви знаєте, скільки даних ви хочете передати в рядок.
  • String::len повертає розмір String у байтах (який може відрізнятися від його довжини в символах).
  • String::chars повертає ітератор поверх фактичних символів. Зауважте, що char може відрізнятися від того, що людина вважатиме "символом" через кластери графем.
  • Коли люди посилаються на рядки, вони можуть говорити про &str або String.
  • Коли тип реалізує Deref<Target = T>, компілятор дозволить вам прозоро викликати методи з T.
    • Ми ще не обговорювали трейт Deref, тому на даний момент це здебільшого пояснює структуру бокової панелі у документації.
    • String реалізує Deref<Target = str>, що прозоро надає йому доступ до методів str.
    • Напишіть і порівняйте let s3 = s1.deref(); and let s3 = &*s1;
  • String реалізовано як оболонку навколо вектора байтів, багато операцій, які ви бачите, що підтримуються над векторами, також підтримуються String, але з деякими додатковими гарантіями.
  • Порівняйте різні способи індексування String:
    • До символу за допомогою s3.chars().nth(i).unwrap(), де i є в межі, поза межами.
    • До підрядка за допомогою s3[0..4], де цей фрагмент знаходиться на межах символів чи ні.
  • Багато типів можна перетворити у рядок за допомогою методу to_string. Цей трейт автоматично реалізується для всіх типів, що реалізують Display, тому все, що може бути відформатовано, також може бути перетворено у рядок.