Effective Rust. David Drysdale
Effective Rust. David Drysdale
Хорошая книга для закрепления базы
Эту книгу проглотил, если сравнивать с предыдущей про алгоритмы: пара недель вместо пары месяцев.
Две главы 3.1 и 3.2 посвящены lifetime и borrow-checker. Кажется, что каждая книга по Rust считает своим долгом объяснить эту тему заново: мол, сложно, уникально, никто не понимает. Я не согласен. У меня в обычном коде проблем уже не возникает. Сложности начинаются, когда появляется unsafe, указатели и желание передать такие структуры в асинхронный рантайм.
В книге есть много отсылок к C++, и это оправдано. Я соглашусь, что объяснять Rust разработчику C++ проще. Возвращаясь к lifetime, в C++ только концепции lvalue/rvalue сложнее, чем вся тема lifetime.
Повторение - мать учения
Хороший набор базовых вещей, которые полезно вспомнить:
- использовать типы для отражения семантики;
- паттерны NewType, Builder;
- различия между трейтами
AsRef,Borrow,ToOwned; - итераторы и их множество методов: концепция с одним
next, с автоматической реализацией всех остальных интерфейсных методов, меня восхищает; Drop= RAII- иерархия трейтов:
FnOnce>Fnmut>Fn. - преждеврменная оптимизация - зло;
- рассудительное использование макросов (декларативные и процедурные). Мне их почти не приходится писать, мало опыта с ними. Наверное, к лучшему;
- главное отличие
core::отstd::- отсутствие аллокатораalloc::
Новое:
- Рефлексию в Rust лучше избегать, но если уж нужно:
std::any::{type_name, Any::type_id, TypeId}. Я не фанат рефлексии, но знать полезно. - Имена фич делят namespace с зависимыми крейтами: крейт может стать фичей, если объявить
optional = true. - Если интерфейс крейта использует типы из зависимых кретов, то стоит реэкспортировать либо крейт целиком, либо типы. По дизайну API лучше почитать отдельный Rust API Guidelines.
Полезные крейты:
- Для ошибок есть два отличных крейта: this_error - если нужно потом их матчить, подходит для библиотек; anyhow/eyre - если планиурется просто их отображать, подходит для приложений.
- Крейт ouroboros для self-referencing структур.
- Документация:
cargo doc --no-deps --open,broken_intra_doc_links,#![warn(missing_docs)] - Управление деревом зависимостей: cargo-udeps, deny, cargo tree, cargo-machete
- FFI: bingen и cxx.
1000 и 1 книга по Rust
В тексте много ссылок на другие Rust-книги, что навело меня на мысль сделать отдельный пост со списком всех Rust book, которые я встречал. А себе отметил две для дальнейшего чтения:
Бонус
В тему отлично ложится статья Закрепи меня покрепче: Pin, самоссылки и почему всё падает, где советуют крейт pin_project.