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

Пример: тип ASCII

// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0

/// Текст, который гарантированно закодирован в 7-битном ASCII.
pub struct Ascii<'a>(&'a mut [u8]);

impl<'a> Ascii<'a> {
    pub fn new(bytes: &'a mut [u8]) -> Option<Self> {
        bytes.iter().all(|&b| b.is_ascii()).then(|| Ascii(bytes))
    }

    /// Создаёт новый `Ascii` из среза байтов без проверки
    /// ASCII-корректности.
    ///
    /// # Safety
    ///
    /// Передача байтов, не относящихся к ASCII, приводит к неопределённому поведению.
    pub unsafe fn new_unchecked(bytes: &'a mut [u8]) -> Self {
        Ascii(bytes)
    }
}

«Тип Ascii — минимальная обёртка над срезом байтов. Внутри они имеют одно и то же представление. Однако Ascii требует, чтобы старший бит не использовался».

Необязательно: дополните пример упоминанием о том, что для проверки предусловий в тестах можно использовать debug_assert!, не влияя на релизные сборки.

// Copyright 2026 Google LLC
// SPDX-License-Identifier: Apache-2.0

unsafe fn new_unchecked(bytes: &mut [u8]) -> Self {
    debug_assert!(bytes.iter().all(|&b| b.is_ascii()))
    Ascii(bytes)
}