我想要一个包含Eq
等特征的元素的向量,我需要异构向量。例如:
let mut x: Vec<Eq> = Vec::new();
x.push(1);
x.push("hello")
我收到一条错误消息,指出Eq
无法成为对象:
error[E0038]: the trait `std::cmp::Eq` cannot be made into an object
--> src/main.rs:2:20
|
2 | let mut x: Vec<Eq> = Vec::new();
| ^^ the trait `std::cmp::Eq` cannot be made into an object
|
= note: the trait cannot use `Self` as a type parameter in the supertrait listing
是否可以有一个指向我可以比较的东西的指针列表,无论它们的类型如何?
答案 0 :(得分:6)
是否可以有一个指向我可以比较的东西的指针列表,无论它们的类型如何?
这没有意义。您如何“比较”String
和File
或Socket
和GuiWindowFontFamily
?
代码也存在一些小问题,即它缺少任何类型的间接性质。有关如何在不对抗对象安全性时制作异构向量的详细信息,请参阅What is the best way to create a heterogeneous collection of objects?。
说到对象安全,there's a great blog series on the subject,其中包含您所遇到的具体错误的详细信息。
那么,我们能做什么?对于初学者,我们可以更具体:
let mut x: Vec<Box<PartialEq<u8>>> = Vec::new();
这是有效的,因为我们说矢量中的所有内容都可以与u8
进行比较,并且没有开放式的无限多种可能性,每种可能性都可以与之比较。
您还可以实现一些特征来决定如何比较事物,然后使用:
trait Silly {
fn silly(&self) -> usize;
}
impl Silly for u8 {
fn silly(&self) -> usize { *self as usize }
}
impl Silly for bool {
fn silly(&self) -> usize { 1 }
}
fn main() {
let mut x: Vec<Box<Silly>> = Vec::new();
}