← Retour au blog
tech 21 May 2026

Understanding Erasing Existentials in Rust

Dive into the world of existential quantifiers in Rust and discover how they influence type and function design.

Article inspired by the original source
Erasing Existentials ↗ wolfgirl.dev

Introduction

In the complex world of software development, Rust stands out with its unique approach to memory management and type safety. One of the most fascinating yet often bewildering concepts is that of existential quantifiers. This concept, while mathematically intimidating at first, offers considerable power for designing generic types and functions. Let's see how this works in practice.

Existential Quantifiers in Rust

An existential quantifier is an expression asserting that "something" exists. In Rust, this is often represented by the keyword dyn in the context of dyn Trait. It means there is an underlying type implementing a certain Trait, but without explicitly specifying what type it is. This allows for polymorphic manipulation of objects, i.e., without knowing their concrete type in advance.

Example with dyn Trait

Imagine you have a Draw trait and several shapes implementing it, like Circle and Square. Using Box<dyn Draw>, you can handle a set of objects implementing Draw without needing to know their concrete type. Here's an example code:

```rust trait Draw { fn draw(&self); }

struct Circle; impl Draw for Circle { fn draw(&self) { println!("I am a circle"); } }

struct Square; impl Draw for Square { fn draw(&self) { println!("I am a square"); } }

fn main() { let shapes: Vec<Box<dyn Draw>> = vec![Box::new(Circle), Box::new(Square)]; for shape in shapes { shape.draw(); } } ```

Function Implementations with impl Trait

Rust also offers implemented traits in return position with impl Trait, which means the function will return a type that implements the specified trait, but without revealing which one. This is useful for encapsulating internal logic while providing a common interface.

Example of Using impl Trait

Suppose you're writing a function that generates an iterator over a collection of numbers. You can use impl Iterator<Item = u32> to indicate that you're returning an iterator without specifying its concrete type:

```rust fn generate_numbers() -> impl Iterator<Item = u32> { vec![1, 2, 3].into_iter() }

fn main() { for number in generate_numbers() { println!("{}", number); } } ```

Challenges and Advantages

Using existential quantifiers offers powerful flexibility and abstraction, but it can also complicate debugging and code optimization. By hiding the concrete type, you forgo certain optimizations the compiler could apply if it knew the exact type.

Conclusion

Existential quantifiers in Rust play a crucial role in designing robust and polymorphic programs. Understanding and correctly using dyn Trait and impl Trait can transform how you design systems in Rust.

Let's discuss your project in 15 minutes.

Rust existential quantifiers dyn Trait impl Trait type safety
Deepthix newsletter · 100% AI · every Monday 8am

An AI agent reads tech for you.

Our AI agent scans ~200 sources per week and ships the best articles to your inbox Monday 8am. Free. One click to unsubscribe.

Visit the newsletter page →

Want to automate your operations?

Let's talk about your project in 15 minutes.

Book a call