Rust Iterators and Zero-Cost Abstractions

Ietrator Fundmaentals

Iterators traverse collections sequentially, abstracting element access patterns. In Rust, they enable functional programming techniques while maintaining performance through compiler optimziations.

Iterator Implementation

Implement the Iterator trait to create custom iterators:

pub trait Iterator {
    type Item;
    fn next(&mut self) -> Option<Self::Item>;
}

Example implementation for a custom collection:

struct LibraryItem {
    title: String,
    creator: String,
    description: String
}

impl LibraryItem {
    fn iterator(&self) -> LibraryIterator {
        LibraryIterator {
            position: 0,
            elements: vec![
                self.title.clone(),
                self.creator.clone(),
                self.description.clone()
            ]
        }
    }
}

struct LibraryIterator {
    position: usize,
    elements: Vec<String>
}

impl Iterator for LibraryIterator {
    type Item = String;
    
    fn next(&mut self) -> Option<String> {
        if self.position < self.elements.len() {
            let result = self.elements[self.position].clone();
            self.position += 1;
            Some(result)
        } else {
            None
        }
    }
}

Iterator Variants

Standard collections provide multiple iterator types:

let values = vec![10, 20, 30];
values.iter();      // Immutable reference
values.into_iter(); // Ownership transfer
values.iter_mut();  // Mutable reference

Adapter Patterns

Rust provides two iterator composition patterns:

// Iterator adapter (lazy evaluation)
let mapped = values.iter().map(|x| x * 2);

// Consumer adapter (eager evaluation)
let total: i32 = values.iter().sum();

Performance Characteristics

Rust's compiler optimizes iterators to match loop performance through:

  • Zero-cost abstractions
  • Loop unrolling optimizations
  • Inline code generation

Demonstration of unrolling optimization:

// Original loop
fn calculate_sum() {
    let numbers = [5, 10, 15];
    let mut result = 0;
    for n in &numbers {
        result += n;
    }
}

// Equivalent unrolled version
fn unrolled_sum() {
    let numbers = [5, 10, 15];
    let result = numbers[0] + numbers[1] + numbers[2];
}

Key Concepts

  • Implement Iterator trait for custom collections
  • Leverage built-in adapter patterns
  • Combine with closures for functional programming
  • Utilize zero-cost abstraction guarantees

Tags: rust iterator Zero-Cost-Abstractions functional-programming compiler-optimization

Posted on Sat, 11 Jul 2026 16:12:17 +0000 by mattlatos