gpt4 book ai didi

rust - 如何创建异构对象集合?

转载 作者:行者123 更新时间:2023-11-29 08:20:29 30 4
gpt4 key购买 nike

我想在 Vec 中使用特征对象.在 C++ 中,我可以创建一个基类 Thing从中派生Monster1Monster2 .然后我可以创建一个 std::vector<Thing*> . Thing对象必须存储一些数据,例如x : int, y : int , 但派生类需要添加更多数据。

目前我有类似的东西

struct Level {
// some stuff here
pub things: Vec<Box<ThingTrait + 'static>>,
}

struct ThingRecord {
x: i32,
y: i32,
}

struct Monster1 {
thing_record: ThingRecord,
num_arrows: i32,
}

struct Monster2 {
thing_record: ThingRecord,
num_fireballs: i32,
}

我定义了一个 ThingTrait使用 get_thing_record() 的方法, attack() , make_noise()等并为 Monster1 实现它们和 Monster2 .

最佳答案

特质对象

实现对象的异构集合(在本例中为向量)的最可扩展方式正是您所拥有的:

Vec<Box<dyn ThingTrait + 'static>>

尽管有时您可能想要的一生不是 'static ,所以你需要这样的东西:

Vec<Box<dyn ThingTrait + 'a>>

您还可以有一个特征的引用集合,而不是盒装特征:

Vec<&dyn ThingTrait>

一个例子:

trait ThingTrait {
fn attack(&self);
}

impl ThingTrait for Monster1 {
fn attack(&self) {
println!("monster 1 attacks")
}
}

impl ThingTrait for Monster2 {
fn attack(&self) {
println!("monster 2 attacks")
}
}

fn main() {
let m1 = Monster1 {
thing_record: ThingRecord { x: 42, y: 32 },
num_arrows: 2,
};

let m2 = Monster2 {
thing_record: ThingRecord { x: 42, y: 32 },
num_fireballs: 65,
};

let things: Vec<Box<dyn ThingTrait>> = vec![Box::new(m1), Box::new(m2)];
}

Box<dyn SomeTrait> , Rc<dyn SomeTrait> , &dyn SomeTrait等都是特质对象。这些允许在无限数量的类型上实现特征,但权衡是它需要一定量的间接和动态调度。

另见:

枚举

如评论中所述,如果您有固定数量的已知备选方案,则不那么开放的解决方案是使用枚举。这不需要值是 Box ed,但它仍然会有少量动态调度来决定在运行时出现哪个具体枚举变体:

enum Monster {
One(Monster1),
Two(Monster2),
}

impl Monster {
fn attack(&self) {
match *self {
Monster::One(_) => println!("monster 1 attacks"),
Monster::Two(_) => println!("monster 2 attacks"),
}
}
}

fn main() {
let m1 = Monster1 {
thing_record: ThingRecord { x: 42, y: 32 },
num_arrows: 2,
};

let m2 = Monster2 {
thing_record: ThingRecord { x: 42, y: 32 },
num_fireballs: 65,
};

let things = vec![Monster::One(m1), Monster::Two(m2)];
}

另见:

关于rust - 如何创建异构对象集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51199988/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com