我有一個帶有通用 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 }],
};
}
uj5u.com熱心網友回復:
“具有不同泛型的相同結構”的行為與“不同結構”非常相似。在這里,當處理 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());
}
}
uj5u.com熱心網友回復:
您可以將點包裝在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 }),
],
};
}
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/412130.html
標籤:
下一篇:具有型別別名的泛型
