RS Rust  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Pin и самоссылочные структуры

Разбирает гарантии закрепления, Unpin, безопасную проекцию и причины, по которым некоторые Future нельзя перемещать. Вопросы распределены между чтением кода, диагностикой компиляции, выбором исправления, граничными случаями и инженерными решениями. Базовый синтаксис соответствует Rust 2024 edition; задания не требуют nightly, если это прямо не сказано.

Отвечено: 0 из 30
--:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат, результаты по 6 тематическим шкалам и подробные объяснения.
Вопрос 1 из 30
Что система типов не проверит самостоятельно для механизма «Время жизни Future»?
Вопрос 2 из 30
Как убрать скрытое предусловие вокруг `std::marker::PhantomPinned`, сохранив исходный замысел?
RustRust · Тестирование и инструменты Cargo
/// ```compile_fail
/// use std::marker::PhantomPinned;
/// struct X { _p: PhantomPinned }
/// let mut x = Box::pin(X { _p: PhantomPinned });
/// let _moved = std::mem::replace(x.as_mut().get_mut(), X { _p: PhantomPinned });
/// ```
pub fn pin_contract() {}
Вопрос 3 из 30
Какой граничный случай важнее всего учесть для механизма «Проекция»?
Вопрос 4 из 30
Что исправить вокруг `std::future::Future`, чтобы граничный вход обрабатывался безопасно?
RustRust · Время жизни Future
fn make<'a>(text: &'a str) -> impl std::future::Future<Output = usize> + 'a {
    async move { text.len() }
}
Вопрос 5 из 30
Что должно войти в отрицательный тест механизма «Закрепление Pin»?
Вопрос 6 из 30
Какое наблюдаемое поведение верно для этого примера?
RustRust · Маркер Unpin
use std::marker::PhantomPinned;
struct SelfAware { data: String, _pin: PhantomPinned }
Вопрос 7 из 30
Какое ограничение языка определяет поведение «Проекция»?
Вопрос 8 из 30
Как лучше всего описать гарантию механизма «Время жизни Future»?
Вопрос 9 из 30
Какой принцип Rust объясняет обычный сценарий для «Маркер Unpin»?
Вопрос 10 из 30
Где заканчивается гарантия обычного сценария для «Маркер Unpin»?
Вопрос 11 из 30
Что показывает `Box::pin` применительно к механизму «Маркер Unpin»?
RustRust · Маркер Unpin
let value = SelfAware { data: "x".into(), _pin: PhantomPinned };
let pinned = Box::pin(value);
Вопрос 12 из 30
Как переработать участок с `std::marker::PhantomPinned`, сохранив требуемое поведение?
RustRust · Маркер Unpin
use std::marker::PhantomPinned;
struct SelfAware { data: String, _pin: PhantomPinned }
Вопрос 13 из 30
Какую регрессию должен ловить `std::marker::PhantomPinned`?
RustRust · Тестирование и инструменты Cargo
/// ```compile_fail
/// use std::marker::PhantomPinned;
/// struct X { _p: PhantomPinned }
/// let mut x = Box::pin(X { _p: PhantomPinned });
/// let _moved = std::mem::replace(x.as_mut().get_mut(), X { _p: PhantomPinned });
/// ```
pub fn pin_contract() {}
Вопрос 14 из 30
Какой путь выполнения выберет Rust после `&mut`?
RustRust · Проекция
struct State { pinned: PinnedField, movable: usize }
// fn project(self: Pin<&mut Self>) -> (Pin<&mut PinnedField>, &mut usize)
Вопрос 15 из 30
Какая правка выдержит ревью контракта «Закрепление Pin»?
RustRust · Закрепление Pin
use std::pin::Pin;
let mut value = Box::pin(String::from("fixed"));
let view: Pin<&mut String> = value.as_mut();
Вопрос 16 из 30
Что проверяет `Box::pin`, если не расширять вывод за пределы выполненного пути?
RustRust · Закрепление Pin
let mut pinned = Box::pin(5u32);
let inner: &mut u32 = Pin::as_mut(&mut pinned).get_mut();
*inner += 1;
assert_eq!(*pinned, 6);
Вопрос 17 из 30
Чем завершится выполнение фрагмента с `std::future::Future`?
RustRust · Время жизни Future
fn make<'a>(text: &'a str) -> impl std::future::Future<Output = usize> + 'a {
    async move { text.len() }
}
Вопрос 18 из 30
Какой сценарий нельзя выводить из одного положительного примера «Тестирование и инструменты Cargo»?
Вопрос 19 из 30
Что можно считать доказанным после успешного выполнения `String::from`?
RustRust · Время жизни Future
let text = String::from("abc");
let f = make(&text);
// spawn(f) потребует 'static и не пройдёт в обычном глобальном executor.
Вопрос 20 из 30
Какое свойство закрепляет сценарий `std::marker::PhantomPinned`?
RustRust · Тестирование и инструменты Cargo
/// ```compile_fail
/// use std::marker::PhantomPinned;
/// struct X { _p: PhantomPinned }
/// let mut x = Box::pin(X { _p: PhantomPinned });
/// let _moved = std::mem::replace(x.as_mut().get_mut(), X { _p: PhantomPinned });
/// ```
pub fn pin_contract() {}

# cargo +nightly miri test pin_projection
# cargo test --doc
Вопрос 21 из 30
Какое утверждение о механизме «Тестирование и инструменты Cargo» можно переносить на другие примеры?
Вопрос 22 из 30
Какое правило связывает типы и наблюдаемое поведение в механизме «Закрепление Pin»?
Вопрос 23 из 30
Какие значения останутся доступными после `std::marker::PhantomPinned`?
RustRust · Безопасность и производительность
struct Task {
    buffer: Vec<u8>,
    ptr: *const u8,
    _pin: std::marker::PhantomPinned,
}
Вопрос 24 из 30
Как обновить фрагмент с `&mut`, чтобы ошибка исчезла по существу?
RustRust · Проекция
struct State { pinned: PinnedField, movable: usize }
// fn project(self: Pin<&mut Self>) -> (Pin<&mut PinnedField>, &mut usize)
Вопрос 25 из 30
Что именно стало проверяемым благодаря сценарию `std::mem::replace`?
RustRust · Проекция
struct State { pinned: PinnedField, movable: usize }
// fn project(self: Pin<&mut Self>) -> (Pin<&mut PinnedField>, &mut usize)

# Негативный сценарий ревью:
# let old = std::mem::replace(&mut this.pinned, new_value);
Вопрос 26 из 30
Что именно стало проверяемым благодаря сценарию `std::marker::PhantomPinned`?
RustRust · Безопасность и производительность
struct Task {
    buffer: Vec<u8>,
    ptr: *const u8,
    _pin: std::marker::PhantomPinned,
}

# Профиль: падение после push, адрес buffer.as_ptr() изменился.
Вопрос 27 из 30
Как изменить фрагмент с `std::marker::PhantomPinned`, чтобы дефект не повторился?
RustRust · Безопасность и производительность
struct Task {
    buffer: Vec<u8>,
    ptr: *const u8,
    _pin: std::marker::PhantomPinned,
}
Вопрос 28 из 30
Какой эксплуатационный край отличает контракт «Безопасность и производительность» от удачного примера?
Вопрос 29 из 30
Что Rust гарантирует при корректном использовании «Безопасность и производительность»?
Вопрос 30 из 30
Чем завершится выполнение фрагмента с `std::pin::Pin`?
RustRust · Закрепление Pin
use std::pin::Pin;
let mut value = Box::pin(String::from("fixed"));
let view: Pin<&mut String> = value.as_mut();

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe)

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу