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раньше времени (он есть в заголовке).