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.
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 concisely implementing 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>,
}
The clone_trait_object!
macro expands to just the following, which you can
handwrite instead if you prefer:
impl Clone for Box<dyn MyTrait> {
fn clone(&self) -> Self {
dyn_clone::clone_box(&**self)
}
}
// and similar for Box<dyn MyTrait + Send>, Box<dyn MyTrait + Sync>, Box<dyn MyTrait + Send + Sync>
Clone
for a trait object that has
DynClone
as a supertrait.std::clone::Clone
.&mut Arc<T>
—▸ &mut T
&T
—▸ T
&T
—▸ Box<T>
&mut Rc<T>
—▸ &mut T