我正在尝试在Rust中实现一个自定义数据结构,其行为类似于数学中的Set(支持Union,Intersection,Disjoint比较等)。我希望构造函数(新的关联函数)采用通用类型T
的一部分并填充一个类型T
的向量。
#[derive(Debug, PartialEq)]
pub struct CustomSet<T> {
elements: Vec<T>
}
impl<T> CustomSet<T> {
pub fn new(input: &[T]) -> Self {
let mut elements = Vec::new();
for elm in input {
elements.push(*elm);
}
CustomSet {
elements
}
}
}
这使编译器非常烦恼,因为T
不一定实现Copy
(或针对此问题的Clone
)。我无法在Copy
上手动实现Clone
或T
,因为我不知道什么是T
。我不想使用Vec<&T>
,因为我真的不想管理生命周期。我认为解决方案是以某种方式要求T
实现Clone
或Copy
,这对我来说很合适,但是我也不知道该怎么做。我们欢迎您提供有关此问题的任何建议。
最佳答案
通用impl中的Copy
约束:
#[derive(Debug, PartialEq)]
pub struct CustomSet<T> {
elements: Vec<T>
}
impl<T: Copy> CustomSet<T> {
pub fn new(input: &[T]) -> Self {
CustomSet {
elements: input.to_vec()
}
}
}
通用impl中的Clone
约束:#[derive(Debug, PartialEq)]
pub struct CustomSet<T> {
elements: Vec<T>
}
impl<T: Clone> CustomSet<T> {
pub fn new(input: &[T]) -> Self {
CustomSet {
elements: input.to_vec()
}
}
}
也可以看看:关于generics - 要求泛型类型实现复制或克隆|来自泛型固定数组的泛型向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65350257/