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, поэтому всё, что можно отформатировать, можно и превратить в строку.