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 パターンを使いたいのですが、同じデータに対して同じトレイトを何度も実装しなければなりません。

  • 問い: ここでの各実装の詳細が型ごとに同じだと仮定すると、繰り返しを避けるにはどのような方法があるでしょうか?

    期待する回答:

    • これを別々のデータ型ではなく enum にする。
    • ユーザー ID を、struct Admin(u64, UserPermission, ModeratorPermission, AdminPermission); のような権限トークンとひとまとめにする。
    • 権限をエンコードする型パラメータを追加する。
    • 先取りして PhantomData に言及する(タイトルにあります)。