rust 将泛型结构视为trait对象

ryhaxcpt  于 2023-05-07  发布在  其他
关注(0)|答案(3)|浏览(143)

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

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 }],
    };
}
u1ehiz5o

u1ehiz5o1#

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

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());
  }
}
zynd9foi

zynd9foi2#

您可以将点包裹在enum中:

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

struct Points {
    points: Vec<PointType>,
}

enum PointType {
    U64(Point<u64>),
    F32(Point<f32>),
}

fn main() {
    let points = Points {
        points: vec![
            PointType::U64(Point { x: 1, y: 2 }),
            PointType::F32(Point { x: 1.1, y: 2.2 }),
        ],
    };
}

Playground

iszxjhcz

iszxjhcz3#

以下作品:

struct Point<T> {
    x: T,
    y: T,
}
struct Points<T> {
    points: Vec<Box<Point<T>>>,
}
fn main() {
    let points = Points {
        points: vec![ Box::new(Point { x: 1, y: 2 }), 
                      Box::new(Point { x: 3, y: 4 })  ]
    };
}

相关问题