РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1200 of 1245 menu

Макрос pin!

Макрос pin! создаёт значение типа Pin, закрепляя переданное выражение на месте в памяти. Это означает, что после создания такого значения переместить его уже нельзя - компилятор гарантирует, что данные останутся по тому же адресу.

Макрос принимает одно выражение, которое нужно закрепить, и возвращает значение типа Pin<&mut T>. В отличие от метода Pin::new_unchecked, макрос pin! не требует блока unsafe, так как он создаёт временную переменную на стеке и закрепляет ссылку на неё безопасным образом.

Синтаксис

pin!(expr)

Пример

Давайте закрепим значение типа String и получим ссылку на него через Pin:

use std::pin::pin; fn main() { let pinned = pin!("abcde"); println!("{}", pinned); }

Результат выполнения кода:

"abcde"

Пример

Давайте закрепим числовое значение и выведем его:

use std::pin::pin; fn main() { let pinned = pin!(12345); println!("{}", pinned); }

Результат выполнения кода:

12345

Пример

Давайте покажем, что закреплённое значение нельзя переместить - попытка присвоить его другой переменной вызовет ошибку компиляции:

use std::pin::pin; fn main() { let pinned = pin!(12345); let moved = pinned; // error: cannot move out of `pinned` println!("{}", moved); }

Результат выполнения кода:

error[E0507]: cannot move out of `pinned`, a captured variable in an `FnMut` closure

Смотрите также

  • тип Pin,
    который гарантирует, что значение не будет перемещено
  • метод new,
    который создаёт Pin из ссылки
  • метод new_unchecked,
    который создаёт Pin без проверок безопасности
  • ключевое слово unsafe,
    которое открывает доступ к небезопасным операциям
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить