Design Patterns

RecipeCratesCategories
Implement an Abstract Factorycat-rust-patterns
Clone a Struct Storing a Boxed Trait Object[![dyn-clone][c-dyn-clone-badge]][c-dyn-clone]cat-rust-patterns
pin-project and pin-project-lite[![pin-project][c-pin-project-badge]][c-pin-project][![pin-project-lite][c-pin-project-lite-badge]][c-pin-project-lite]cat-rust-patterns
Implement the Typestate Pattern in Rustcat-rust-patterns

Implement an Abstract Factory

See also:

Clone a Struct Storing a Boxed Trait Object

dyn-clone dyn-clone-crates.io dyn-clone-github dyn-clone-lib.rs cat-rust-patterns cat-no-std

The dyn-clone crate provides a DynClone trait that can be used in trait objects, and a clone_box function that can clone any sized or dynamically sized implementation of DynClone. Types that implement the standard library's std::clone::Clone trait are automatically usable by a DynClone trait object.

use dyn_clone::DynClone;

trait MyTrait: DynClone {
    fn recite(&self);
}

impl MyTrait for String {
    fn recite(&self) {
        println!("{} ♫", self);
    }
}

fn main() {
    let line = "The slithy structs did gyre and gimble the namespace";

    // Build a trait object holding a String.
    // This requires String to implement MyTrait and std::clone::Clone.
    let x: Box<dyn MyTrait> = Box::new(String::from(line));

    x.recite();

    // The type of x2 is a Box<dyn MyTrait> cloned from x.
    let x2 = dyn_clone::clone_box(&*x);

    x2.recite();
}

pin-project and pin-project-lite

pin-project pin-project-crates.io pin-project-github pin-project-lib.rs cat-no-std cat-no-std::no-alloc cat-rust-patterns

pin-project is a crate for safe and ergonomic pin-projection. The #[pin_project] attribute creates projection types covering all the fields of struct or enum.

pin-project-lite pin-project-lite-crates.io pin-project-lite-github pin-project-lite-lib.rs cat-rust-patterns cat-no-std cat-no-std::no-alloc

A lightweight version of pin-project written with declarative macros.

The pin_project! macro creates a projection type covering all the fields of struct.

// // COMING SOON

See also:

  • https://doc.rust-lang.org/std/pin/index.html#projections-and-structural-pinning
  • https://doc.rust-lang.org/std/pin/struct.Pin.html