Макрос 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,
которое открывает доступ к небезопасным операциям