我有一个带有泛型 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/