Перейти к содержанию

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

Posted on:5 марта 2023 г. at 09:48

Example Dynamic OG Image link

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

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

Строка:

ЗамыселФрагмент
Конкатенация строкformat!("{x}{y}")
Вывести строку (любое отображение к любой Write)write!(x, "{y}")
Разделение по шаблонуs.split(pattern)
… с &strs.split("abc")
… с chars.split('/')
… с замыканиемs.split(char::is_numeric)
Разделение по пробеламs.split_whitespace()
Разделение по переводу строки на новую строкуs.lines()
Разделение по регулярному выражениюRegex::new(r"\s")?.split("один два три")

Ввод-вывод:

ЗамыселФрагмент
Создание нового файлаFile::create(PATH)?
То же самое, через OpenOptionsOpenOptions::new().create(true).write(true).truncate(true).open(PATH)

Макросы:

ЗамыселФрагмент
Аргументы Macromacro_rules! var_args { ($($args:expr),*) => {{ }} }
Использование args, например, вызов f несколько раз.$( f($args); )*

Эзотерика:

ЗамыселФрагмент
Более чистые замыканияwants_closure({ let c = outer.clone(); move || use_clone(c) })
Использование в замыканиях ‘ошибок’iter.try_for_each(|x| { Ok::<(), Error>(()) })?;
Итерация и изменение &mut [T], если T CopyCell::from_mut(mut_slice).as_slice_of_cells()
Получить срез с длиной.&original_slice[offset..][..length]
Обеспечение того, чтобы _ trait Т была объектнобезопаснойconst _: Option<&dyn T> = None;

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

ПримерSend (примечание под таблицей)не Send
Sync*Большинство типов… Arc<T>, Mutex<T>MutexGuard<T>, RwLockReadGuard<T>

Экземпляр t, в котором T: Send можно переместить в другой поток, а T: Sync означает, что &t можно переместить в другой поток.

Итераторы

Использование:

Базовые

Предположим, что у вас есть коллекция c типа C:

Итератор

Если у вас итератор i:

Для циклов
Совместимый итератор

Создание итераторов:

Основная тема

Предположим, что у вас есть struct Collection<T> {}:

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

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

Кроме того, можно добавить удобные методы:

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

Native Loop Support

Многие пользователи ожидают, что ваша коллекция будет стандартно работать с циклами:

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

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

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

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

Типыu8 … i128f32 / f64Строка
u8 … i128u8::try_from(x)?$^1$x as f32$^3$x.to_string()
f32 / f64x as u8$^2$x as f32x.to_string()
Stringx.parse::<u8>()?x.parse::<f32>()?x

$^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

Если у вас есть x типа …Используйте это …
Stringx
CStringx.into_string()?
OsStringx.to_str()?.to_string()
PathBufx.to_str()?.to_string()
Vec<u8>$^1$String::from_utf8(x)?
&strx.to_string()$^i$
&CStrx.to_str()?.to_string()
&OsStrx.to_str()?.to_string()
&Pathx.to_str()?.to_string()
&[u8]$^1$String::from_utf8_lossy(x).to_string()

CString

Если у вас есть x типа …Используйте это …
StringCString::new(x)?
CStringx
OsString$^2$CString::new(x.to_str()?)?
PathBufCString::new(x.to_str()?)?
Vec<u8>$^1$CString::new(x)?
&strCString::new(x)?
&CStrx.to_owned()$^i$
&OsStr$^2$CString::new(x.to_os_string().into_string()?)?
&PathCString::new(x.to_str()?)?
&[u8]$^1$CString::new(Vec::from(x))?
*mut c_char$^3$unsafe { CString::from_raw(x) }

OsString

Если у вас есть x типа …Используйте это …
StringOsString::from(x)$^i$
CStringOsString::from(x.to_str()?)
OsStringx
PathBufx.into_os_string()
Vec<u8>$^1$?
&strOsString::from(x)$^i$
&CStrOsString::from(x.to_str()?)
&OsStrOsString::from(x)$^i$
&Pathx.as_os_str().to_owned()
&[u8]$^1$?

PathBuf

Если у вас есть x типа …Используйте это …
StringPathBuf::from(x)$^i$
CStringPathBuf::from(x.to_str()?)
OsStringPathBuf::from(x)$^i$
PathBufx
Vec<u8>$^1$?
&strPathBuf::from(x)$^i$
&CStrPathBuf::from(x.to_str()?)
&OsStrPathBuf::from(x)$^i$
&PathPathBuf::from(x)$^i$
&[u8]$^1$?

Vec<u8>

Если у вас есть x типа …Используйте это …
Stringx.into_bytes()
CStringx.into_bytes()
OsString?
PathBuf?
Vec<u8>$^1$x
&strVec::from(x.as_bytes())
&CStrVec::from(x.to_bytes_with_nul())
&OsStr?
&Path?
&[u8]$^1$x.to_vec()

&str

Если у вас есть x типа …Используйте это …
Stringx.as_str()
CStringx.to_str()?
OsStringx.to_str()?
PathBufx.to_str()?
Vec<u8>$^1$std::str::from_utf8(&x)?
&strx
&CStrx.to_str()?
&OsStrx.to_str()?
&Pathx.to_str()?
&[u8]$^1$std::str::from_utf8(x)?

&CStr

Если у вас есть x типа …Используйте это …
StringCString::new(x)?.as_c_str()
CStringx.as_c_str()
OsString$^2$x.to_str()?
PathBuf?$^4$
Vec<u8>$^1$$^,$$^5$CStr::from_bytes_with_nul(&x)?
&str?$^4$
&CStrx
&OsStr$^2$?
&Path?
&[u8]$^1$$^,$$^5$CStr::from_bytes_with_nul(x)?
*const c_char$^1$unsafe { CStr::from_ptr(x) }

&OsStr

Если у вас есть x типа …Используйте это …
StringOsStr::new(&x)
CString?
OsStringx.as_os_str()
PathBufx.as_os_str()
Vec<u8>$^1$?
&strOsStr::new(x)
&CStr?
&OsStrx
&Pathx.as_os_str()
&[u8]$^1$?

&Path

Если у вас есть x типа …Используйте это …
StringPath::new(x)$^r$
CStringPath::new(x.to_str()?)
OsStringPath::new(x.to_str()?)$^r$
PathBufPath::new(x.to_str()?)$^r$
Vec<u8>$^1$?
&strPath::new(x)$^r$
&CStrPath::new(x.to_str()?)
&OsStrPath::new(x)$^r$
&Pathx
&[u8]$^1$?

&[u8]

Если у вас есть x типа …Используйте это …
Stringx.as_bytes()
Stringx.as_bytes()
OsString?
PathBuf?
Vec<u8>$^1$&x
&strx.as_bytes()
&CStrx.to_bytes_with_nul()
&OsStrx.as_bytes()$^2$
&Path?
&[u8]$^1$x

другое

Необходимоделайте xИспользуйте это …
*const c_charCStringx.as_ptr()

$^i$ Краткая форма x.into() возможна, если можно определить тип. $^r$ Краткая форма x.as_ref() возможна, если можно определить тип. $^1$ Вы должны или должны, если вызов unsafe, убедиться, что необработанные данные поставляются с допустимым представлением типа строки (например, данные UTF-8 для string). $^2$ Только на некоторых платформах существует std::os::<ваша_os>::ffi::OsStrExt с вспомогательными методами для получения необработанного &[u8] представления базового OsStr. Используйте остальную часть таблицы, чтобы перейти оттуда, например:

use std::os::unix::ffi::OsStrExt;
let bytes: &[u8] = my_os_str.as_bytes();
CString::new(bytes)?

$^3$ Должно быть, c_char пришло из предыдущего CString. Если он исходит из FFI, см. &CStr вместо этого. $^4$ Нет известного варианта для x , будет не хватать завершающего 0x0. Лучший способ, вероятно, перейти на CString. $^5$ Надо убедиться, что вектор действительно заканчивается 0x0.

Вывод строки

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

APIs:

МакросВыводКомментарий
format!(fmt)StringПреобразует в строку.
print!(fmt)ConsoleЗаписывает в стандартный поток вывода.
println!(fmt)ConsoleЗаписывает в стандартный поток вывода.
eprint!(fmt)ConsoleЗаписывает в стандартный поток ошибки.
eprintln!(fmt)ConsoleЗаписывает в стандартный поток ошибки.
write!(dst, fmt)BufferНе забудьте использовать std::io::Write;
writeln!(dst, fmt)BufferНе забудьте использовать std::io::Write;
МетодКомментарий
x.to_string()Создает String, реализованный для любого типа Display.

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

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

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

ТипРеализует
StringDebug, Display
CStringDebug
OsStringDebug
PathBufDebug
Vec<u8>Debug
&strDebug, Display
&CStrDebug
&OsStrDebug
&PathDebug
&[u8]Debug
boolDebug, Display
charDebug, Display
u8i128Debug, Display
f32, f64Debug, Display
!Debug, Display
()Debug

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

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

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

{ [argument] ':' [[fill] align] [sign] ['#'] [width [$]] ['.' precision [$]] [type] }
ЭлементСмысл
argumentЧисло (0, 1, …), переменная или имя, например, print!("{x}").
fillСимвол для заполнения пробелов (например, 0), если указана ширина.
alignВлево (<), по центру (^) или вправо (>), если указана ширина.
signМожет быть + для того, чтобы знак всегда печатался.
#Альтернативное форматирование, например, приукрашивание отладочного модуля форматирования ? или префикс шестнадцатеричный с 0x.
widthМинимальная ширина (≥ 0), заполнение символом (по умолчанию - пробел). Если начинается с 0, начало заполняется нулями.
precisionДесятичные цифры (≥ 0) для числовых значений или максимальная ширина для нечисловых значений.
$Интерпретирует ширину или точность как идентификатор аргумента, чтобы разрешить динамическое форматирование.
typeФорматирование отладки (?), шестнадцатеричный (x), двоичный (b), восьмеричный (o), указатель (p), exp (e)… см. далее.
Пример форматированияКомментарий
{}Печать аргумента с помощью команды «Display».
{x}То же самое, но использует переменную ‘x’.
{:?}Выводит аргумент с помощью отладки.
{2:#?}Вывод 3-го аргумента с форматированием отладки.
{val:^2$}Центрирует аргумент val, ширина которого задается 3-м аргументом.
{:<10.3}Выравнивание по левому краю с шириной 10 и точностью 3.
{val:#x}Отформатирует аргумент val как шестнадцатеричный с начальным значением 0x (альтернативный формат для ‘x’).
ПримерКомментарий
println!("{}", x)Печать x с помощью Display в стандартный поток вывода. Вывести на консоль и перейти на новую строку.
println!("{x}")То же самое, но используйте переменную ‘x’.
format!("{a:.3} {b:?}")Возвращает строку преобразования ‘a’ с 3 цифрами после запятой плюс пробел и b с отладкой.