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に言及する(タイトルにあります)。