generics - 将通用结构视为特征对象

标签 generics rust

我有一个带有泛型 T 的结构,我想为其创建一个该结构实例的向量,其中每个实例 T 可以不同。我意识到我可能需要使用一个盒子并且可能需要将我的结构视为特征对象,但我不确定如何,因为它不是实现相同特征的不同结构的集合,而是具有不同的通用。以下是我目前所拥有的,并希望能说明我正在努力实现的目标,它不起作用,因为 dyn 关键字似乎需要一个特征而不是一个通用结构。

struct Point<T> {
    x: T,
    y: T,
}

struct Points {
    points: Vec<Box<dyn Point>>,
}
fn main() {
    let points = Points {
        points: vec![Point { x: 1, y: 2 }, Point { x: 1.1, y: 2.2 }],
    };
}

最佳答案

“具有不同泛型的相同结构”的行为与“不同的结构”非常相似。在这里,在处理特征对象时,具体类型并不重要,这是特征对象背后的关键思想。

例如:

trait Trait {
  fn foo(&self) -> &'static str;
}

struct Point<T> {
  x: T,
  y: T,
}

// you may have different impls for different generics
impl<T> Trait for Point<T> {
  fn foo(&self) -> &'static str {
    "a point"
  }
}

fn main() {
  let points: Vec<Box<dyn Trait>> = vec![
    Box::new(Point {x: 1, y: 2}),
    Box::new(Point {x: 1.1, y: 2.2}),
    Box::new(Point {x: (), y: ()}),
  ];

  for point in points {
    println!("{}", point.foo());
  }
}

关于generics - 将通用结构视为特征对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70701651/

相关文章:

ios - 如何将 CLLCooperative2D 纬度/经度转换为 NSNumber

swift - 试图 swift 概括

java - 在 HashMap 中使用嵌套泛型类型

arrays - 在 Rust 中,我可以在不对值进行硬编码的情况下实例化我的 const 数组吗?编译时评估?

arrays - 如何在 Rust 的结构中实现动态二维数组?

java - 不兼容的类型 : ArrayList<C<CAP#1>> cannot be converted to ArrayList<C<? >>

java - 为什么原始类型转换不会在 Java 中产生警告?

rust - Rust 如何强制/实现 RAII

rust - 你能弃用 Rust 中的某个属性吗?

rust - 如何在 Rust 中迭代数组时更改数组中的值