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

Проектирование библиотечного API

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

Отвечено: 0 из 30
--:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом вопросе верен только один вариант. После завершения вы увидите общий результат, результаты по 6 тематическим шкалам и подробные объяснения.
Вопрос 1 из 30
Какую регрессию должен ловить `std::borrow::Cow::Borrowed`?
RustRust · Borrowed и owned формы
assert!(matches!(normalize("rust"), std::borrow::Cow::Borrowed(_)));
assert_eq!(normalize("Rust"), "rust");
Вопрос 2 из 30
Чем завершится выполнение фрагмента с `Config`?
RustRust · Совместимость версий Semver
pub struct Config {
    pub timeout_ms: u64,
}
Вопрос 3 из 30
Какой принцип Rust объясняет обычный сценарий для «Совместимость версий Semver»?
Вопрос 4 из 30
Что нужно пересмотреть в использовании `std::borrow::Cow`, чтобы код стал корректным?
RustRust · Borrowed и owned формы
pub fn normalize(input: &str) -> std::borrow::Cow<'_, str> {
    if input.bytes().all(|b| !b.is_ascii_uppercase()) {
        std::borrow::Cow::Borrowed(input)
    } else {
        std::borrow::Cow::Owned(input.to_ascii_lowercase())
    }
}
Вопрос 5 из 30
Какое объяснение механизма «Borrowed и owned формы» не смешивает компиляцию и выполнение?
Вопрос 6 из 30
Где заканчивается гарантия обычного сценария для «Безопасность и производительность»?
Вопрос 7 из 30
Что именно объясняет сообщение компилятора?
RustRust · Документация
/// Parses a header.
///
/// # Errors
/// Returns `ParseError::InvalidHeader` when the magic bytes are absent.
///
/// # Examples
/// ```
/// # use mylib::parse_header;
/// assert!(parse_header(b"HDR\0").is_ok());
/// ```
pub fn parse_header(bytes: &[u8]) -> Result<Header, ParseError> { /* ... */ }
Вопрос 8 из 30
Как лучше всего описать гарантию механизма «Тестирование и инструменты Cargo»?
Вопрос 9 из 30
Какое свойство закрепляет сценарий `#[non_exhaustive]`?
RustRust · Совместимость версий Semver
#[non_exhaustive]
pub struct Config { pub timeout_ms: u64 }
Вопрос 10 из 30
Какой принцип лежит в основе механизма «Безопасность и производительность»?
Вопрос 11 из 30
Какое утверждение о механизме «Ошибки» можно переносить на другие примеры?
Вопрос 12 из 30
Какой граничный случай важнее всего учесть для механизма «Совместимость версий Semver»?
Вопрос 13 из 30
Как следует интерпретировать результат проверки `ParseError::InvalidHeader`?
RustRust · Документация
/// Parses a header.
///
/// # Errors
/// Returns `ParseError::InvalidHeader` when the magic bytes are absent.
///
/// # Examples
/// ```
/// # use mylib::parse_header;
/// assert!(parse_header(b"HDR\0").is_ok());
/// ```
pub fn parse_header(bytes: &[u8]) -> Result<Header, ParseError> { /* ... */ }

# RUSTDOCFLAGS="-D warnings" cargo doc --no-deps
# cargo test --doc
Вопрос 14 из 30
Что нужно изменить вокруг `#[non_exhaustive]`, чтобы устранить первопричину?
RustRust · Ошибки
#[non_exhaustive]
#[derive(Debug)]
pub enum ParseError {
    InvalidHeader,
    UnsupportedVersion(u16),
}
Вопрос 15 из 30
Что ещё нужно проверить, прежде чем считать реализацию «Ошибки» надёжной?
Вопрос 16 из 30
Какое изменение входа способно поменять вывод о механизме «Документация»?
Вопрос 17 из 30
Где заканчивается гарантия обычного сценария для «Borrowed и owned формы»?
Вопрос 18 из 30
На какую часть контракта распространяется проверка `bytes`?
RustRust · Безопасность и производительность
pub fn bytes(&self) -> Vec<u8> {
    self.data.clone()
}

# Профиль показывает 35% времени в memcpy из bytes(), вызываемого в цикле.
Вопрос 19 из 30
Какая реализация выражает механизм «Документация» без лишнего копирования?
RustRust · Документация
/// Parses a header.
///
/// # Errors
/// Returns `ParseError::InvalidHeader` when the magic bytes are absent.
///
/// # Examples
/// ```
/// # use mylib::parse_header;
/// assert!(parse_header(b"HDR\0").is_ok());
/// ```
pub fn parse_header(bytes: &[u8]) -> Result<Header, ParseError> { /* ... */ }
Вопрос 20 из 30
Что именно стало проверяемым благодаря сценарию `ParseError::UnsupportedVersion`?
RustRust · Ошибки
fn handle(e: &ParseError) {
    match e {
        ParseError::UnsupportedVersion(v) => eprintln!("unsupported {v}"),
        _ => eprintln!("cannot parse"),
    }
}
Вопрос 21 из 30
Что можно считать доказанным после успешного выполнения `typical_user_flow`?
RustRust · Тестирование и инструменты Cargo
// tests/public_api.rs
use mylib::Config;
#[test]
fn typical_user_flow() {
    let cfg = Config::builder().timeout_ms(500).build().unwrap();
    assert_eq!(cfg.timeout_ms(), 500);
}
Вопрос 22 из 30
Чем завершится выполнение фрагмента с `#[non_exhaustive]`?
RustRust · Ошибки
#[non_exhaustive]
#[derive(Debug)]
pub enum ParseError {
    InvalidHeader,
    UnsupportedVersion(u16),
}
Вопрос 23 из 30
Какой край контракта «Тестирование и инструменты Cargo» чаще всего остаётся незамеченным?
Вопрос 24 из 30
Какой способ правки делает использование `typical_user_flow` корректным и явным?
RustRust · Тестирование и инструменты Cargo
// tests/public_api.rs
use mylib::Config;
#[test]
fn typical_user_flow() {
    let cfg = Config::builder().timeout_ms(500).build().unwrap();
    assert_eq!(cfg.timeout_ms(), 500);
}
Вопрос 25 из 30
Как исправить контракт, нарушенный при использовании `Config`?
RustRust · Совместимость версий Semver
pub struct Config {
    pub timeout_ms: u64,
}
Вопрос 26 из 30
Что проверяет `typical_user_flow`, если не расширять вывод за пределы выполненного пути?
RustRust · Тестирование и инструменты Cargo
// tests/public_api.rs
use mylib::Config;
#[test]
fn typical_user_flow() {
    let cfg = Config::builder().timeout_ms(500).build().unwrap();
    assert_eq!(cfg.timeout_ms(), 500);
}

# cargo test --test public_api
# cargo semver-checks  # внешний инструмент
Вопрос 27 из 30
Чем завершится выполнение фрагмента с `bytes`?
RustRust · Безопасность и производительность
pub fn bytes(&self) -> Vec<u8> {
    self.data.clone()
}
Вопрос 28 из 30
Что нужно изменить вокруг `bytes`, чтобы устранить первопричину?
RustRust · Безопасность и производительность
pub fn bytes(&self) -> Vec<u8> {
    self.data.clone()
}
Вопрос 29 из 30
Какой путь выполнения выберет Rust после `std::borrow::Cow`?
RustRust · Borrowed и owned формы
pub fn normalize(input: &str) -> std::borrow::Cow<'_, str> {
    if input.bytes().all(|b| !b.is_ascii_uppercase()) {
        std::borrow::Cow::Borrowed(input)
    } else {
        std::borrow::Cow::Owned(input.to_ascii_lowercase())
    }
}
Вопрос 30 из 30
Какое правило Rust точнее всего описывает механизм «Документация»?

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

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

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

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