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

Запечатывание с помощью перечислений

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

use std::collections::BTreeMap;
pub enum GetSource {
    WebUrl(String),
    BytesMap(BTreeMap<String, Vec<u8>>),
}

impl GetSource {
    fn get(&self, url: &str) -> Option<&Vec<u8>> {
        match self {
            Self::WebUrl(source) => unimplemented!(),
            Self::BytesMap(map) => map.get(url),
        }
    }
}
  • Мотивация: API спроектирован вокруг конкретного списка допустимых для него типов, и пользователи API не должны его расширять.

  • Перечисления в Rust — это алгебраические типы данных: для каждого варианта можно определить свою структуру.

    Для некоторых предметных областей такого полиморфизма может хватить. Экспериментируйте и смотрите, что работает и какие решения кажутся более разумными.

  • Когда пользовательская часть API ссылается на перечисление, пользователи знают, какие типы допустимы в качестве входных данных, и могут создавать эти типы доступными для этого методами.

    • Если типы, из которых состоит перечисление, имеют инварианты, которые API поддерживает внутри себя, и единственный способ создать эти типы для пользователей — конструкторы, которые создают и поддерживают эти инварианты, то можно быть уверенным, что входные данные обобщённого метода сохраняют свои инварианты.

    • Если же типы, из которых состоит перечисление, — это типы, которые пользователь может свободно создавать, то, возможно, придётся учитывать санитизацию и интерпретацию данных.