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