Найти тему
Ржавый код

Стандартная библиотека

Оглавление

Однострочники

Фрагменты, которые распространены, но все же легко забыть. Смотрите Rust Cookbook для получения дополнительной информации.

Строка:

-2

Ввод-вывод:

-3

Макросы:

-4

Эзотерика:

-5

Потокобезопасность

-6

Экземпляр 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(), чтобы он мог создавать элементы.
-7

На данный момент у вас есть что-то, что может вести себя как итератор, но нет способа фактически получить его. Смотрите ниже, чтобы узнать, как это работает.

Общие и изменяемые итераторы

Необходимы, если вы хотите, чтобы ваша коллекция была полезна при заимствовании:

  • `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`
-8

Предоставление итераторов:

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 {}` работает.
-9

Как вы можете видеть, trait IntoIterator - это то, что фактически связывает вашу коллекцию с trait IntoIter, которую вы создали выше.

Совместимость с другими итераторами

Разрешите итераторам 3-й стороны «собирать» коллекцию:

  • `impl FromIterator for Collection<T> {}` - работает как `some_iter.collect::<Collection<_>>()`.
-10

Преобразование чисел

As-correct-as-it-currently-gets числовые преобразования.

-11

[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`

-12

`CString`

-13

`OsString`

-14

`PathBuf`

-15

`Vec<u8>`

-16

`&str`

-17

`&CStr`

-18

`&OsStr`

-19

`&Path`

-20

`&[u8]`

-21

другое

-22

[i] Краткая форма x.into() возможна, если можно определить тип.

[r] Краткая форма x.as_ref() возможна, если можно определить тип.

[1] Вы должны или должны, если вызов `unsafe`, убедиться, что необработанные данные поставляются с допустимым представлением типа строки (например, данные UTF-8 для string).

[2] Только на некоторых платформах существует `std::os::<ваша_os>::ffi::OsStrExt` с вспомогательными методами для получения необработанного `&[u8]` представления базового OsStr. Используйте остальную часть таблицы, чтобы перейти оттуда, например:

-23

[3] Должно быть, `c_char` пришло из предыдущего `CString`. Если он исходит из FFI, см. `&CStr` вместо этого.

[4] Нет известного варианта для x , будет не хватать завершающего 0x0. Лучший способ, вероятно, перейти на CString.

[5] Надо убедиться, что вектор действительно заканчивается 0x0.

Вывод строки

Преобразование типов в string или их вывод.

APIs:

-24

`fmt` является строковым литералом, таким как "число {}", который указывает формат вывода (смотрите ниже 'Форматирование') и дополнительные параметры.

Типы для печати

В `format!`, типы преобразуются через trait `Display` "{}" или `Debug` "{:?}", неполный список:

-25

Реализация более сложных типов, почти все является `Debug;`, для сложных типов может потребовать специальный метод преобразования в Display.

Форматирование

Каждое обозначение аргумента в макросе форматирования либо {} или {argument}, либо следовать базовому синтаксису:

-26
-27
-28
-29

Статья на list-site.