Однострочники
Фрагменты, которые распространены, но все же легко забыть. Смотрите Rust Cookbook для получения дополнительной информации.
Строка:
Ввод-вывод:
Макросы:
Эзотерика:
Потокобезопасность
Экземпляр t, в котором T: Send можно переместить в другой поток, а T: Sync означает, что &t можно переместить в другой поток.
Итераторы
Использование:
Базовые
Предположим, что у вас есть коллекция `c` типа `C`:
- `c.into_iter()` - превращает коллекцию `c` в итератор `i` и потребляет `*c`. Для `C` требуется реализация IntoIterator. Тип элемента зависит от того, каким был `C`. Стандартизированный способ получения итераторов.
- `c.iter()` - вежливый метод, предоставляет некоторые коллекции, возвращает заимствование итератора не потребляя c.
- `c.iter_mut()` - то же самое, но мутабельно заимствующий итератор, который позволяет изменять коллекцию.
Итератор
Если у вас итератор `i`:
- `i.next()` - возвращает значение Some(x) следущего элемента или None, если элементы закончились в переборе.
Для циклов
- `for x in c {}` - синтаксический сахар, вызывает c.into_iter() в цикле возврахая элемент в `x` до получения None.
Совместимый итератор
- `let c = other_iter.collect::<C<_>>()` - соберает итерируемую коллекцию в `c`.
Создание итераторов:
Основная тема
Предположим, что у вас есть `struct Collection<T> {}`:
- `struct IntoIter<T> {}` - создаёт структуру для хранения статуса итерации (например, индекса) для итерации значений.
- `impl Iterator for IntoIter<T> {}` - реализует Iterator::next(), чтобы он мог создавать элементы.
На данный момент у вас есть что-то, что может вести себя как итератор, но нет способа фактически получить его. Смотрите ниже, чтобы узнать, как это работает.
Общие и изменяемые итераторы
Необходимы, если вы хотите, чтобы ваша коллекция была полезна при заимствовании:
- `struct Iter<T> {}` - создание структуры удержания `&Collection<T>` для общей итерации.
- `struct IterMut<T> {}` - аналогично, но удерживает ``&mut Collection<T>`` для изменяемой итерации.
- `impl Iterator for Iter<T> {}` - реализует общую итерацию.
- `impl Iterator for IterMut<T> {}` - реализует изменяемую итерацию.
Кроме того, можно добавить удобные методы:
- `Collection::iter(&self) -> Iter`
- `Collection::iter_mut(&mut self) -> IterMut`
Предоставление итераторов:
Native Loop Support
Многие пользователи ожидают, что ваша коллекция будет стандартно работать с циклами:
- `impl IntoIterator for Collection<T> {}` - теперь `for x in c {}` работает.
- `impl IntoIterator for &Collection<T> {}` - теперь `for x in &c {}` работает.
- `impl IntoIterator for &mut Collection<T> {}` - теперь `for x in &mut c {}` работает.
Как вы можете видеть, trait IntoIterator - это то, что фактически связывает вашу коллекцию с trait IntoIter, которую вы создали выше.
Совместимость с другими итераторами
Разрешите итераторам 3-й стороны «собирать» коллекцию:
- `impl FromIterator for Collection<T> {}` - работает как `some_iter.collect::<Collection<_>>()`.
Преобразование чисел
As-correct-as-it-currently-gets числовые преобразования.
[1] Если тип true подмножество `from()` работает напрямую, например, `u32::from(my_u8)`.
[2] Усечение (`11.9_f32 as u8` дает 11) и насыщение (`1024_f32 as u8` дает 255).
[3] Может искажать число `u64::MAX as f32` или создавать бесконечность `u128::MAX as f32`.
Также см. преобразования и арифметические подводные камни, чтобы узнать больше вещей, которые могут пойти не так при работе с числами.
Преобразование строк
Если вам нужна строка типа ...
`String`
`CString`
`OsString`
`PathBuf`
`Vec<u8>`
`&str`
`&CStr`
`&OsStr`
`&Path`
`&[u8]`
другое
[i] Краткая форма x.into() возможна, если можно определить тип.
[r] Краткая форма x.as_ref() возможна, если можно определить тип.
[1] Вы должны или должны, если вызов `unsafe`, убедиться, что необработанные данные поставляются с допустимым представлением типа строки (например, данные UTF-8 для string).
[2] Только на некоторых платформах существует `std::os::<ваша_os>::ffi::OsStrExt` с вспомогательными методами для получения необработанного `&[u8]` представления базового OsStr. Используйте остальную часть таблицы, чтобы перейти оттуда, например:
[3] Должно быть, `c_char` пришло из предыдущего `CString`. Если он исходит из FFI, см. `&CStr` вместо этого.
[4] Нет известного варианта для x , будет не хватать завершающего 0x0. Лучший способ, вероятно, перейти на CString.
[5] Надо убедиться, что вектор действительно заканчивается 0x0.
Вывод строки
Преобразование типов в string или их вывод.
APIs:
`fmt` является строковым литералом, таким как "число {}", который указывает формат вывода (смотрите ниже 'Форматирование') и дополнительные параметры.
Типы для печати
В `format!`, типы преобразуются через trait `Display` "{}" или `Debug` "{:?}", неполный список:
Реализация более сложных типов, почти все является `Debug;`, для сложных типов может потребовать специальный метод преобразования в Display.
Форматирование
Каждое обозначение аргумента в макросе форматирования либо {} или {argument}, либо следовать базовому синтаксису:
Статья на list-site.