This 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.
The signature of clone_box
is:
fn clone_box<T>(t: &T) -> Box<T> where T: ?Sized + DynClone
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(); }
This crate includes a macro for generating the implementation impl std::clone::Clone for Box<dyn MyTrait>
in terms of dyn_clone::clone_box
:
// As before. trait MyTrait: DynClone { /* ... */ } dyn_clone::clone_trait_object!(MyTrait); // Now data structures containing Box<dyn MyTrait> can derive Clone: #[derive(Clone)] struct Container { trait_object: Box<dyn MyTrait>, }
Check out the dyn-clonable crate which provides the same Clone impl for Box<dyn MyTrait>
in a more concise attribute form.