我想在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> {}
| ^^^^
您正在为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};
}