是否有可能拥有实现Eq的异类矢量类型?

FCo*_*FCo 3 rust

我想要一个包含特征的元素的向量Eq,我需要异构向量.例如:

let mut x: Vec<Eq> = Vec::new();

x.push(1);
x.push("hello")
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息,指出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
Run Code Online (Sandbox Code Playgroud)

是否可以有一个指向我可以比较的东西的指针列表,无论它们的类型如何?

She*_*ter 7

是否可以有一个指向我可以比较的东西的指针列表,无论它们的类型如何?

这没有意义.你如何"比较"a String和a File或a Socket和a GuiWindowFontFamily

代码也有一些小问题,即它缺乏特性的任何间接性.请参阅创建异构对象集合的最佳方法是什么?有关如何在不对抗对象安全性时制作异构向量的概述.

说到对象安全,有一个很棒的博客系列关于这个主题,它涵盖了你得到的具体错误的细节.

所以,我们能做些什么?对于初学者,我们可以更具体:

let mut x: Vec<Box<PartialEq<u8>>> = Vec::new();
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为我们说矢量中的所有内容都可以与a进行比较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();
}
Run Code Online (Sandbox Code Playgroud)

  • @FCo我们谈到了哪些关键类型?你不能把它们包裹在枚举中吗? (2认同)
  • 枚举是一个很好的解决方案,IMO.然后由数据结构的用户根据需要实现`Eq`. (2认同)