Agent Skills by ALSEL
Anthropic Claudeソフトウェア開発⭐ リポ 12品質スコア 76/100

m04-zero-cost

重要:ジェネリクス、トレイト、ゼロコスト抽象化に使用します。トリガー:E0277、E0308、E0599、generic、trait、impl、dyn、where、単態化、静的ディスパッチ、動的ディスパッチ、impl Trait、トレイト境界未満足。

description の原文を見る

CRITICAL: Use for generics, traits, zero-cost abstraction. Triggers: E0277, E0308, E0599, generic, trait, impl, dyn, where, monomorphization, static dispatch, dynamic dispatch, impl Trait, trait bound not satisfied, 泛型, 特征, 零成本抽象, 单态化

SKILL.md 本文

ゼロコスト抽象化

レイヤー1: 言語メカニズム

コア質問

コンパイル時ポリモーフィズムと実行時ポリモーフィズムのどちらが必要か?

ジェネリクスとトレイトオブジェクトから選択する前に:

  • 型はコンパイル時に既知か?
  • 異種のコレクションが必要か?
  • パフォーマンス上の優先順位は?

エラー → 設計質問

エラー避けるべき対応代わりに尋ねるべきこと
E0277「トレイト境界を追加する」この抽象化は正しいレベルにあるか?
E0308「型を修正する」型は統一されるべきか、それとも異なるべきか?
E0599「トレイトをインポートする」そのトレイトは正しい抽象化か?
E0038「オブジェクト安全にする」本当に動的ディスパッチが必要か?

思考プロンプト

トレイト境界を追加する前に:

  1. どのような抽象化が必要か?

    • 同じ動作、異なる型 → トレイト
    • 異なる動作、同じ型 → enum
    • 抽象化が不要 → 具体的な型
  2. 型がいつ既知になるか?

    • コンパイル時 → ジェネリクス(静的ディスパッチ)
    • 実行時 → トレイトオブジェクト(動的ディスパッチ)
  3. トレードオフの優先順位は?

    • パフォーマンス → ジェネリクス
    • コンパイル時間 → トレイトオブジェクト
    • 柔軟性 → 状況による

上へ遡る ↑

型システムが反発するとき:

E0277 (トレイト境界が満たされていない)
    ↑ 尋ねる: 抽象化レベルは正しいか?
    ↑ 確認: m09-domain (どの動作が抽象化されているか?)
    ↑ 確認: m05-type-driven (newtype を使うべきか?)
継続的なエラー遡る先質問
複雑なトレイト境界m09-domain抽象化は正しいか?
オブジェクト安全性の問題m05-type-driventypestate が役立つか?
型の爆発m10-performancedyn のオーバーヘッドを受け入れるか?

下へ降りる ↓

設計から実装へ:

「同じ動作を持つ型を抽象化する必要がある」
    ↓ 型がコンパイル時に既知 → impl Trait またはジェネリクス
    ↓ 型が実行時に決定 → dyn Trait

「異なる型のコレクションが必要」
    ↓ 閉じた集合 → enum
    ↓ 開いた集合 → Vec<Box<dyn Trait>>

「異なる型を返す必要がある」
    ↓ 同じ型 → impl Trait
    ↓ 異なる型 → Box<dyn Trait>

クイックリファレンス

パターンディスパッチコードサイズ実行時コスト
fn foo<T: Trait>()静的+肥大化ゼロ
fn foo(x: &dyn Trait)動的最小限vtable 参照
impl Trait 戻り値静的+肥大化ゼロ
Box<dyn Trait>動的最小限割り当て + vtable

構文比較

// 静的ディスパッチ - 型はコンパイル時に既知
fn process(x: impl Display) { }      // 引数位置
fn process<T: Display>(x: T) { }     // 明示的なジェネリクス
fn get() -> impl Display { }         // 戻り値位置

// 動的ディスパッチ - 型は実行時に決定
fn process(x: &dyn Display) { }      // 参照
fn process(x: Box<dyn Display>) { }  // 所有

エラーコード リファレンス

エラー原因クイックフィックス
E0277型がトレイトを実装していないimpl を追加するか、境界を変更
E0308型の不一致ジェネリクスパラメータを確認
E0599メソッドが見つからないuse でトレイトをインポート
E0038トレイトがオブジェクト安全でないジェネリクスを使用するか、再設計

判断ガイド

シナリオ選択理由
パフォーマンス重視ジェネリクス実行時コストゼロ
異種コレクションdyn Trait実行時に異なる型
プラグインアーキテクチャdyn Traitコンパイル時に未知の型
コンパイル時間削減dyn Trait単態化が少ない
小さく、既知の型セットenum間接参照なし

オブジェクト安全性

トレイトはオブジェクト安全であれば:

  • Self: Sized 境界を持たない
  • Self を返さない
  • ジェネリックメソッドを持たない
  • where Self: Sized を非オブジェクト安全なメソッドに使用

アンチパターン

アンチパターン問題点より良い方法
すべてをジェネリック化コンパイル時間、複雑さ可能な限り具体的な型
既知の型に dyn を使用不要な間接参照ジェネリクス
複雑なトレイト階層理解が困難よりシンプルな設計
オブジェクト安全性を無視柔軟性の制限必要に応じて dyn 計画

関連スキル

のとき参照先
型駆動設計m05-type-driven
ドメイン抽象化m09-domain
パフォーマンスに関する懸念m10-performance
Send/Sync 境界m07-concurrency

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
k1-c
リポジトリ
k1-c/linear-tui
ライセンス
MIT
最終更新
2026/3/5

Source: https://github.com/k1-c/linear-tui / ライセンス: MIT

本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: k1-c · k1-c/linear-tui · ライセンス: MIT