可能无法为这种类型实现`Copy`特性

问题描述 投票:1回答:1

我想在Rust中制作一个通用的字典,以便更快地制作原型,其中的键是String,值是包装在AnyType容器中的类型。

[请注意,仅在结构之上添加普通的derive语句实际上是不够的,这就是为什么它不包含在原始内容中的原因。

我的实现看起来像这样:

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

generics rust hashmap generic-programming
1个回答
-1
投票

您正在为Copy实现AnyType,但没有为AT实现。因此,编译器知道不能在所有实例中复制完整类型的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添加到所有类型参数,由于A可以被复制,因为T可以被复制,因此rust编译器现在将接受该代码。

#[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};
}
© www.soinside.com 2019 - 2024. All rights reserved.