#clone #trait-object #dyn

no-std dyn-clone

对象安全的 Clone 特性

18 个稳定版本

1.0.17 2024 年 2 月 26 日
1.0.16 2023 年 11 月 3 日
1.0.14 2023 年 9 月 19 日
1.0.12 2023 年 7 月 15 日
1.0.1 2019 年 12 月 23 日

#31 in Rust 模式

Download history 587470/week @ 2024-04-28 580720/week @ 2024-05-05 631857/week @ 2024-05-12 632360/week @ 2024-05-19 613855/week @ 2024-05-26 648882/week @ 2024-06-02 645148/week @ 2024-06-09 646312/week @ 2024-06-16 668202/week @ 2024-06-23 594040/week @ 2024-06-30 656553/week @ 2024-07-07 652517/week @ 2024-07-14 695455/week @ 2024-07-21 679529/week @ 2024-07-28 673644/week @ 2024-08-04 679903/week @ 2024-08-11

2,759,998 每月下载量
4,843 个 crate 中使用 (295 个直接使用)

MIT/Apache 许可协议

15KB
164

对象安全的 Clone 特性

github crates.io docs.rs build status

此 crate 提供了一个 DynClone 特性,可用于 trait 对象,以及一个 clone_box 函数,可以克隆任何大小的或动态大小的 DynClone 实现。实现了标准库的 std::clone::Clone 特性的类型可以自动用于 DynClone 特性对象。

clone_box 的签名是

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();
}

此 crate 包含一个宏,用于生成基于 dyn_clone::clone_boximpl std::clone::Clone for Box<dyn MyTrait> 实现

// 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>,
}

许可协议

根据您的选择,此代码库受 Apache 许可协议 2.0 版MIT 许可协议 许可。
除非您明确声明,否则任何有意提交以包含在此代码库中的贡献,根据 Apache-2.0 许可协议定义,应如上所述双许可,而无需任何附加条款或条件。

无运行时依赖