Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
zhanghandong avatar

M04 Zero Cost

  • 803 installs
  • 1.3k repo stars
  • Updated May 24, 2026
  • zhanghandong/rust-skills

This is a copy of m04-zero-cost by actionbook - installs and ranking accrue to the original listing.

m04-zero-cost is a Rust agent skill that helps developers choose between generics and trait objects for zero-cost abstractions for engineers who hit trait bound, type mismatch, and method resolution errors during polymor

About

m04-zero-cost is a Rust language mechanics skill from zhanghandong/rust-skills focused on zero-cost abstractions and the core question of compile-time versus runtime polymorphism. Before picking generics or trait objects, the skill prompts whether the concrete type is known at compile time, whether a heterogeneous collection is required, and what performance priority applies. It maps common compiler errors—including E0277 trait bound not satisfied, E0308 type mismatches, and E0599 missing methods—to design questions instead of shallow error explanations. Triggers cover generics, traits, impl Trait, dyn, where clauses, monomorphization, static dispatch, and dynamic dispatch keywords in English and Chinese. Developers reach for m04-zero-cost when Rust fights back on trait bounds and they need a decision framework for static versus dynamic dispatch without abandoning zero-cost guarantees.

  • Translates Rust errors E0277, E0308, E0599, E0038 into design-level questions about abstraction
  • Guides decision between compile-time generics (static dispatch) and runtime trait objects (dynamic dispatch)
  • 3-step thinking prompt covering needed abstraction, type knowledge timing, and performance trade-offs
  • Maps concrete Rust patterns: trait bounds, impl Trait, monomorphization, dyn, where clauses
  • Includes bilingual triggers for English and Chinese Rust learners

M04 Zero Cost by the numbers

  • 803 all-time installs (skills.sh)
  • +7 installs in the week ending Jul 28, 2026 (Skillselion tracking)
  • Security screen: MEDIUM risk (skills.sh audit)
  • Data as of Jul 28, 2026 (Skillselion catalog sync)
npx skills add https://github.com/zhanghandong/rust-skills --skill m04-zero-cost

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs803
repo stars1.3k
Security audit3 / 3 scanners passed
Last updatedMay 24, 2026
Repositoryzhanghandong/rust-skills

When should Rust code use generics versus trait objects?

Correctly choose between generics and trait objects in Rust so they get zero-cost abstractions without fighting the compiler.

Who is it for?

Rust developers debugging trait bound and dispatch errors who need a structured generics-versus-trait-objects decision framework.

Skip if: Beginners learning Rust syntax basics or teams writing code with no traits, generics, or polymorphism requirements.

When should I use this skill?

Rust compilation fails with E0277, E0308, E0599, or the developer debates generics, dyn, impl Trait, or monomorphization.

What you get

Trait-bound designs using generics or dyn Trait with justified static or dynamic dispatch and resolved compiler errors.

  • Polymorphism design decisions
  • Resolved trait-bound code patterns

By the numbers

  • Maps 3 Rust compiler errors: E0277, E0308, E0599
  • Layer 1 language-mechanics skill in rust-skills series

Files

SKILL.mdMarkdownGitHub ↗

Zero-Cost Abstraction

Layer 1: Language Mechanics

Core Question

Do we need compile-time or runtime polymorphism?

Before choosing between generics and trait objects:

  • Is the type known at compile time?
  • Is a heterogeneous collection needed?
  • What's the performance priority?

---

Error → Design Question

ErrorDon't Just SayAsk Instead
E0277"Add trait bound"Is this abstraction at the right level?
E0308"Fix the type"Should types be unified or distinct?
E0599"Import the trait"Is the trait the right abstraction?
E0038"Make object-safe"Do we really need dynamic dispatch?

---

Thinking Prompt

Before adding trait bounds:

1. What abstraction is needed?

  • Same behavior, different types → trait
  • Different behavior, same type → enum
  • No abstraction needed → concrete type

2. When is type known?

  • Compile time → generics (static dispatch)
  • Runtime → trait objects (dynamic dispatch)

3. What's the trade-off priority?

  • Performance → generics
  • Compile time → trait objects
  • Flexibility → depends

---

Trace Up ↑

When type system fights back:

E0277 (trait bound not satisfied)
    ↑ Ask: Is the abstraction level correct?
    ↑ Check: m09-domain (what behavior is being abstracted?)
    ↑ Check: m05-type-driven (should use newtype?)
Persistent ErrorTrace ToQuestion
Complex trait boundsm09-domainIs the abstraction right?
Object safety issuesm05-type-drivenCan typestate help?
Type explosionm10-performanceAccept dyn overhead?

---

Trace Down ↓

From design to implementation:

"Need to abstract over types with same behavior"
    ↓ Types known at compile time → impl Trait or generics
    ↓ Types determined at runtime → dyn Trait

"Need collection of different types"
    ↓ Closed set → enum
    ↓ Open set → Vec<Box<dyn Trait>>

"Need to return different types"
    ↓ Same type → impl Trait
    ↓ Different types → Box<dyn Trait>

---

Quick Reference

PatternDispatchCode SizeRuntime Cost
fn foo<T: Trait>()Static+bloatZero
fn foo(x: &dyn Trait)DynamicMinimalvtable lookup
impl Trait returnStatic+bloatZero
Box<dyn Trait>DynamicMinimalAllocation + vtable

Syntax Comparison

// Static dispatch - type known at compile time
fn process(x: impl Display) { }      // argument position
fn process<T: Display>(x: T) { }     // explicit generic
fn get() -> impl Display { }         // return position

// Dynamic dispatch - type determined at runtime
fn process(x: &dyn Display) { }      // reference
fn process(x: Box<dyn Display>) { }  // owned

Error Code Reference

ErrorCauseQuick Fix
E0277Type doesn't impl traitAdd impl or change bound
E0308Type mismatchCheck generic params
E0599No method foundImport trait with use
E0038Trait not object-safeUse generics or redesign

---

Decision Guide

ScenarioChooseWhy
Performance criticalGenericsZero runtime cost
Heterogeneous collectiondyn TraitDifferent types at runtime
Plugin architecturedyn TraitUnknown types at compile
Reduce compile timedyn TraitLess monomorphization
Small, known type setenumNo indirection

---

Object Safety

A trait is object-safe if it:

  • Doesn't have Self: Sized bound
  • Doesn't return Self
  • Doesn't have generic methods
  • Uses where Self: Sized for non-object-safe methods

---

Anti-Patterns

Anti-PatternWhy BadBetter
Over-generic everythingCompile time, complexityConcrete types when possible
dyn for known typesUnnecessary indirectionGenerics
Complex trait hierarchiesHard to understandSimpler design
Ignore object safetyLimits flexibilityPlan for dyn if needed

---

Related Skills

WhenSee
Type-driven designm05-type-driven
Domain abstractionm09-domain
Performance concernsm10-performance
Send/Sync boundsm07-concurrency

Related skills

How it compares

Pick m04-zero-cost over generic Rust cheat sheets when compiler errors force a generics-versus-dyn decision with zero-cost abstraction tradeoffs.

FAQ

Which Rust errors does m04-zero-cost address?

m04-zero-cost addresses E0277 trait bound not satisfied, E0308 type mismatches, and E0599 method resolution failures. The skill reframes each error as a compile-time versus runtime polymorphism design question.

How does m04-zero-cost choose generics or trait objects?

m04-zero-cost asks whether types are known at compile time, whether heterogeneous collections are needed, and what performance priority applies. Generics favor static monomorphized dispatch; dyn trait objects favor runtime polymorphism.

Is M04 Zero Cost safe to install?

skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

Rustbackend

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.