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

String

String — это растущая строка в кодировке UTF-8:

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let mut s1 = String::new();
    s1.push_str("Hello");
    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>, что означает, что на String можно вызывать все методы str.

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(); и let s3 = &*s1;.
  • String реализован как обёртка над вектором байтов. Многие операции, которые поддерживаются для векторов, работают и для String, но с некоторыми дополнительными гарантиями.
  • Сравните разные способы индексировать String:
    • По символу — с помощью s3.chars().nth(i).unwrap(), где i внутри границ и вне их.
    • По подстроке — с помощью s3[0..4], где срез выровнен по границам символов или нет.
  • Многие типы можно преобразовать в строку с помощью метода to_string. Этот трейт автоматически реализуется для всех типов, реализующих Display, поэтому всё, что можно отформатировать, можно и превратить в строку.