18 stable releases
1.0.17 | Feb 26, 2024 |
---|---|
1.0.16 | Nov 3, 2023 |
1.0.14 | Sep 19, 2023 |
1.0.12 | Jul 15, 2023 |
1.0.1 | Dec 23, 2019 |
#22 in Rust patterns
3,467,944 downloads per month
Used in 5,242 crates
(316 directly)
15KB
164 lines
Clone trait that is object-safe
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<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>,
}
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.