10 советов rust с кодом
Совет №1
Эта необычная синтаксическая особенность операторов #match была предложена мне одним из подписчиков:
var_name @ match_value => … позволяет вам захватить значение match_value для использования в блоке match. Этот пример кода должен прояснить, что происходит:
Совет № 2
std::time::Instant можно использовать как простой способ измерения времени выполнения блока кода.
Совет № 3
TIL о числовых типах NonZero. Во время компиляции гарантировано, что значения не будут нулевыми. Это также настоящая абстракция с нулевыми затратами, поскольку если вы определите, например, Option, значение “0” будет отображено на “None”. Очень здорово! Вот пример:
Совет № 4
Fn, FnMut, FnOnce. Специальные свойства, используемые для передачи закрытий в качестве аргументов функций.
- Fn: закрытие, которое не изменяет окружение.
- FnMut: может изменять окружение.
- FnOnce: выполняется один раз и потребляет окружение.
Вот пример, показывающий FnMut в действии:
Совет № 5
Один из примеров, где Rust действительно блистает, – это работа с потоками и чтение их возвращаемых значений. Это кажется намного проще, чем во многих других языках. Вот простой пример обработки результатов двух потоков:
Совет № 6
Итераторы можно расширять с помощью функции chain(). Rust также изящно обрабатывает цепочки #optionals, которые могут иметь или не иметь значение:
Совет № 7
Знаете ли вы, что Rust поддерживает деструктуризацию большинства распространенных типов данных? Вот пример для структур:
Совет № 8
Unit Structs и Tuple Structs – полезные, но малоизвестные конструкции в системе типов Rust.
- Единичные структуры могут представлять концепцию на уровне типа. Также они удобны для реализации признаков без данных.
- Структуры кортежей: похожи на кортежи, но могут реализовывать fns
Совет № 9
Можно определять константы в трейтах, а также переопределять значения в конкретных имплах трейта.
Совет № 10
В Rust есть C-совместимые типы объединений. Они по своей сути небезопасны, поскольку члены объединения используют одну и ту же память. Лучший вариант использования, который я могу придумать, – это взаимодействие с C/C++ и, возможно, с протоколами двоичных данных, объединяющими байтовые массивы с другими типами.