dc
dyn-clone
cargo install dyn-clone
dc

dyn-clone

Clone trait that is object-safe

by David Tolnay

1.0.6 (see all)License:MIT OR Apache-2.0
cargo install dyn-clone
Readme

Clone trait that is object-safe

github crates.io docs.rs build status

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

Example

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&lt;dyn MyTrait&gt; = Box::new(String::from(line));

x.recite();

// The type of x2 is a Box&lt;dyn MyTrait&gt; cloned from x.
let x2 = dyn_clone::clone_box(&amp;*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>,
}

// 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.


License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this crate by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

GitHub Stars

264

LAST COMMIT

8d ago

MAINTAINERS

1

CONTRIBUTORS

2

OPEN ISSUES

2

OPEN PRs

0
VersionTagPublished
1.0.6
8d ago
1.0.5
3mos ago
1.0.4
1yr ago
1.0.3
2yrs ago
No alternatives found
No tutorials found
Add a tutorial