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.

Метки:

Разделы:

Дата изменения: