Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Что такое закрепление

  • Закреплённый (pinned) тип не может менять свой адрес в памяти (перемещаться)
  • Значение, на которое указывает указатель, не может быть перемещено безопасным кодом

Pin<Ptr> использует систему владения, чтобы контролировать доступ к закреплённому значению. Вместо изменения языка для обеспечения pinning используется система владения Rust. Pin владеет своим содержимым, и ничто в его безопасном API не вызывает перемещения.

Это объясняется в

This slide should take about 5 minutes.

Концептуально pinning запрещает поведение перемещения по умолчанию.

Может показаться, что это изменение самого языка.

Однако обёртка Pin на самом деле не меняет в языке ничего принципиального.

Pin не предоставляет безопасных API, которые позволили бы перемещение. Поэтому он может предотвращать побитовое копирование.

Небезопасные API позволяют авторам библиотек оборачивать типы, которые не реализуют Unpin, но они обязаны соблюдать те же гарантии.

В документации Pin используется термин «pointer types».

Термин «pointer type» гораздо шире, чем примитивный тип указателя в языке.

«Pointer type» — это любой тип, реализующий Deref, у которого целевой тип реализует Unpin.

Замечание о стиле Rust: это ограничение трейта проверяется через ограничения трейтов на конструкторе ::new(), а не на самом типе.