Пример: тип 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)
}