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

PhantomData 1/4: устранение дублирования одних и тех же данных и семантики

Паттерн newtype иногда вступает в противоречие с принципом DRY. Как это решить?

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

pub struct UserId(u64);
impl ChatUser for UserId { /* ... */ }

pub struct PatronId(u64);
impl ChatUser for PatronId { /* ... */ }

pub struct ModeratorId(u64);
impl ChatUser for ModeratorId { /* ... */ }
impl ChatModerator for ModeratorId { /* ... */ }

pub struct AdminId(u64);
impl ChatUser for AdminId { /* ... */ }
impl ChatModerator for AdminId { /* ... */ }
impl ChatAdmin for AdminId { /* ... */ }

// И так далее...
fn main() {}
  • Проблема: мы хотим использовать паттерн newtype для различения прав доступа, но приходится снова и снова реализовывать одни и те же трейты для одних и тех же данных.

  • Спросите: допустим, детали каждой реализации здесь одинаковы для разных типов. Какими способами можно не повторяться?

    Ожидаемые ответы:

    • Сделайте это перечислением, а не отдельными типами данных.
    • Объедините ID пользователя с токенами разрешений, например struct Admin(u64, UserPermission, ModeratorPermission, AdminPermission);
    • Добавить параметр типа, который кодирует права доступа.
    • Упомянуть PhantomData раньше времени (он есть в заголовке).