Module :: clone_dyn
Derive to clone dyn structures.
By default, Rust does not support cloning for trait objects due to the Clone trait requiring compile-time knowledge of the type's size. The clone_dyn crate addresses this limitation through procedural macros, allowing for cloning collections of trait objects. The crate's purpose is straightforward: it allows for easy cloning of dyn< Trait > with minimal effort and complexity, accomplished by applying the derive attribute to the trait.
Alternative
There are few alternatives dyn-clone, dyn-clonable. Unlike other options, this solution is more concise and demands less effort to use, all without compromising the quality of the outcome.
Basic use-case
Demonstrates the usage of clone_dyn to enable cloning for trait objects.
By default, Rust does not support cloning for trait objects due to the Clone trait
requiring compile-time knowledge of the type's size. The clone_dyn crate addresses
this limitation through procedural macros, allowing for cloning collections of trait objects.
Overview
This example shows how to use the clone_dyn crate to enable cloning for trait objects,
specifically for iterators. It defines a custom trait, IterTrait, that encapsulates
an iterator with specific characteristics and demonstrates how to use CloneDyn to
overcome the object safety constraints of the Clone trait.
The IterTrait Trait
The IterTrait trait is designed to represent iterators that yield references to items (&'a T).
These iterators must also implement the ExactSizeIterator and DoubleEndedIterator traits.
Additionally, the iterator must implement the CloneDyn trait, which allows cloning of trait objects.
The trait is implemented for any type that meets the specified requirements.
Cloning Trait Objects
Rust's type system does not allow trait objects to implement the Clone trait directly due to object safety constraints.
Specifically, the Clone trait requires knowledge of the concrete type at compile time, which is not available for trait objects.
The CloneDyn trait from the clone_dyn crate provides a workaround for this limitation by allowing trait objects to be cloned.
Procedural macros generates the necessary code for cloning trait objects, making it possible to clone collections of trait objects.
The example demonstrates how to implement Clone for boxed IterTrait trait objects.
get_iter Function
The get_iter function returns a boxed iterator that implements the IterTrait trait.
If the input is Some, it returns an iterator over the vector.
If the input is None, it returns an empty iterator.
It's not possible to use impl Iterator here because the code returns iterators of two different types:
std::slice::Iterwhen the input isSome.std::iter::Emptywhen the input isNone.
To handle this, the function returns a trait object ( Box< dyn IterTrait > ).
However, Rust's Clone trait cannot be implemented for trait objects due to object safety constraints.
The CloneDyn trait addresses this problem by enabling cloning of trait objects.
use_iter Function
The use_iter function demonstrates the use of the CloneDyn trait by cloning the iterator.
It then iterates over the cloned iterator and prints each element.
Main Function
The main function demonstrates the overall usage by creating a vector, obtaining an iterator, and using the iterator to print elements.
#
#
#
# #
Try out cargo run --example clone_dyn_trivial.
See code.
To add to your project
Try out from the repository