此类型可能无法实现“复制”特征

The `Copy` trait may not be implemented for this type

我想制作一个奇特的通用字典以加快原型制作,其中键是 Strings,值是包装在 AnyType 容器中的类型。

请注意,仅在结构上方添加普通的派生语句是不够的,这就是为什么它没有包含在原始内容中的原因。

我的实现是这样的:

use std::collections::HashMap;
use std::boxed::Box;
use std::rc::Rc;
use std::cell::RefCell;
use std::clone::Clone;

struct AnyType<AT> {
    ___value: Rc<RefCell<Box<AT>>>
}
impl<AT> AnyType<AT> {
    pub fn new(value: AT) -> AnyType<AT> {
        AnyType { 
            ___value: Rc::new(RefCell::from(Box::new(value)))
        }
    }
}

impl<AT> Copy for AnyType<AT> {}
impl<AT> Clone for AnyType<AT> {
    fn clone(&self) -> Self {
        *self
    }
}

struct Dict<AT> {
    ___self: HashMap<String, AnyType<AT>>
}

impl<AT> Dict<AT> {
    pub fn new(keys: Option<Vec<String>>, values: Option<Vec<AnyType<AT>>>) 
        -> Result<Dict<AT>, &'static str>
    {
        // ...

错误:

error[E0204]: the trait `Copy` may not be implemented for this type
  --> src/lib.rs:18:10
   |
8  |     ___value: Rc<RefCell<Box<AT>>>
   |     ------------------------------ this field does not implement `Copy`
...
18 | impl<AT> Copy for AnyType<AT> {}
   |          ^^^^

Playground

您正在为 AnyType 而不是 AT 实施 Copy。因此,编译器知道无法在所有实例中复制完整类型 AnyType。这是因为您没有指定 AT 也必须实现 Copy。您将必须指定特征边界 AT: Copy 来告诉 Rust 也可以复制 AT。

一个简短的例子:

#[derive(Clone)]
struct A<T> {
    _v: T
}

impl<T> Copy for A<T> {}

// Overloaded functions in Rust!
fn main() {
    let a = A::<i32>{_v: 1};
}

也会导致error[E0204]: the trait `Copy` may not be implemented for this type

然而,通过将特征绑定 Copy 添加到所有类型参数,rust 编译器现在将接受代码,因为 A 可以被复制,因为 T 可以被复制。

#[derive(Clone)]
struct A<T: Copy> {
    _v: T
}

impl<T> Copy for A<T> where T: Copy {}

// Overloaded functions in Rust!
fn main() {
    let a = A::<i32>{_v: 1};
}