簡體   English   中英

將泛型結構視為特征 object

[英]Treat generic struct as trait object

我有一個帶有通用 T 的結構,我想為其創建一個包含該結構實例的向量,其中每個實例的 T 可以不同。 我意識到我可能需要使用一個盒子,並且可能需要將我的結構視為特征 object,但我不確定如何,因為它不是實現相同特征的不同結構的集合,而是具有相同結構的不同的泛型。 下面是我到目前為止所擁有的,希望能說明我想要實現的目標,它不起作用,因為 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 object 背后的關鍵思想。

例如:

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

如果您已經在 nightly 上,並且啟用了box_syntax功能,您還可以編寫box Point { x: 1, y: 2 }來節省一些樣板文件,盡管可能不值得切換到 nightly 。

您可以將點包裝在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 }),
        ],
    };
}

操場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM