匹配复杂的继承-y 东西

Matching complex inheritance-y thing

我想在 Rust 中匹配一种复杂的继承-y 东西:

struct Entity {
    pub kind: EntityKind,
}

pub enum EntityKind {
    Player(PlayerData),
}

pub struct PlayerData {
    pub name: String,
}

如何将它与模式匹配的东西相匹配,例如:

// pretend theres a vector of entities called E
match E[i] {
    // match PlayerKind,
    // match another kind here
}

当 E[i] 是 Player 枚举项时,我该怎么做才能获得 PlayerData?

一种解决方案,同时让您的设计保持新类型 (learn more about newtypes):

struct Entity {
    pub kind: EntityKind,
}

pub enum EntityKind {
    Player(PlayerData),
    Weapon(WeaponData),
}

pub struct PlayerData {
    pub name: String,
}

pub struct WeaponData {
    pub damage_per_shot: i32,
}

fn f(e: EntityKind) {
    match e {
        EntityKind::Player(player_data) => { /* do sth with player data */ },
        EntityKind::Weapon(weapon_data) => { /* do sth with weapon data */ },
    }
}

(Playground)


但是,我宁愿为此利用特征系统:

struct Entity {
    pub kind: EntityKind,
}

pub trait EntityKind { 
    fn do_something(&self); // or &mut self, if needed
}

pub struct PlayerData {
    pub name: String,
}
impl EntityKind for PlayerData {
    fn do_something(&self) {
        // do sth with player data
    }
}

pub struct WeaponData {
    pub damage_per_shot: i32,
}
impl EntityKind for WeaponData {
    fn do_something(&self) {
        // do sth with weapon data
    }
}

// Dynamic dispatch version
fn f(e: &EntityKind) {
    e.do_something();
}

// Static dispatch version (a la C++ template)
fn g<E: EntityKind>(e: E) {
    e.do_something();
}