Strings
Links:
- Ссылки на память в Rust
- https://rust.nizeclub.ru/_10.html
- http://xion.io/post/code/rust-string-args.html
Статьи в разделе:
Substring & Character Methods
String Iterator Methods
String printing, splitting, joining and formatting.
В Rust строки хранятся в формате UTF-8, где каждый символ может занимать от 1 до 4 байт. Поэтому индексация идёт не по символам напрямую, а по байтам или с учётом корректных границ символов (Unicode scalar values).
Пример строкового литерала:
String
Тип данных с владельцем. Имеет изменяемый размер, неизвестный в момент компиляции. Представляет собой векторную структуру:
Поскольку структура содержит Vec, это значит, что есть указатель на массив памяти, размер строки size структуры и ёмкость capacity (сколько можно добавить к строке перед дополнительным выделением памяти под строку).
Работа с String: если у вас String, нужно сначала получить срез &str с помощью &
&str
Ссылка на часть, slice от String (куча), str (стек) или статической константы. Не имеет владельца, размер фиксирован, известен в момент компиляции.
- &String можно неявно превращать в &str;
- &str нельзя неявно превращать в &String.
Warning
Пока существует &str её в области жизни нельзя менять содержимое памяти, на которое она ссылается, даже владельцем строки.
&String
Ссылка на String. Не имеет владельца, размер фиксирован, известен в момент компиляции.
str
Набор символов (литералов), размещённых на стеке. Не имеет владельца, размер фиксирован, известен в момент компиляции. Можно превращать str в String через признак from:
Строковые константы
Примеры
Изменение строк
При наличии String, нужно передать ссылку &mut String для изменения:
Строки с владением
Получение String с передачей владения нужно при получении строки от функции, передача в поток (thread):
Структуры
Если структуре надо владеть своими данными - использовать String. Если нет, можно использовать &str, но нужно указать время жизни (lifetime), чтобы структура не пережила взятую ей строку:
Разница между to_lowercase(), to_ascii_lowercase(), make_ascii_lowercase() и upper-аналогов
| Функция | to_uppercase() | to_ascii_uppercase() | make_ascii_uppercase() |
|---|---|---|---|
| Возвращает | Новая String | Новая String | () (меняет входную строку) |
| Текст | Unicode | только ASCII | только ASCII |
| Память | Новая строка | Новая строка | Не выделяет память |
| Speed | Медленно | Быстро | Быстрее всех |
| Особенности | Обработка спец-символов (ß→SS) | Нет, пропускает спец-символы | Нет, пропускает спец-символы |
Передача любых строк в функцию с переводом по ссылке
Можно воспользоваться встроенным типажом AsRef для перевода ссылок строки всех видов (String, &str, Box<str> и т.д.) в &str:
Arc str против String
Link: https://www.youtube.com/watch?v=A4cKi7PTJSs&t=822s
Arc<[T]> или он же Arc<str> является предпочтительным вариантом перед Vec<T> (он же String), в случае неизменяемых данных:
- Дешёвое клонирование, сложность O(1)
- Меньше размер (16 байт против 24 байт)
- Включает в себя
Deref<[T]>, что позволяет использовать все те же возможности:len(), итерировать, индексировать
Другие особенности:
- В случае синхронного кода без потоков ещё быстрее-удобнее
Rc<str>; Arc<String>не то же самое, чтоArc<str>- более сложно и требует двойной указатель, чтобы добраться до данных.