rust 如何使一个结构体通用于两种类型,以获得有时隐藏的信息?

eivgtgni  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(120)

我正在制作一个多人游戏,服务器完全了解游戏状态(Sure),但客户端只能看到其中的一部分(SometimesSure,世界的一部分是隐藏的,例如一副牌中的纸牌)。我想使用相同的GameState结构体,并使其通用于这两种情况:

enum SometimesSure<T> {
    Hidden,
    Visibile(T),
}

struct Sure<T>(T);

struct GameState {
    pub map_state: MapState,
    pub player_states: PlayerStates,
}

其中MapStatePlayerStates应位于客户端上:

struct MapState {
    pub tiles: Vec<SometimesSure<u8>>,
}
struct PlayerStates {
    pub points: SometimesSure<bool>,
    pub name: SometimesSure<String>,
}

在服务器上:

struct MapState {
    pub tiles: Vec<Sure<u8>>,
}
struct PlayerStates {
    pub points: Sure<bool>,
    pub name: Sure<String>,
}

如何使用泛型或关联类型来解决这个问题?

58wvjzkj

58wvjzkj1#

理想情况下,你应该使用更高类型的类型,但是Rust不支持这个概念。然而,由于generic associated types(GAT)最近已经稳定,你可以使用一个helper trait(下面代码中的StateType)和一个泛型关联类型来实现同样的目的:

trait StateType {
    type Type<T>;
}

struct ClientStateType;

impl StateType for ClientStateType {
    type Type<T> = SometimesSure<T>;
}

struct ServerStateType;
impl StateType for ServerStateType {
    type Type<T> = Sure<T>;
}

struct MapState<S: StateType> {
    pub tiles: Vec<S::Type<u8>>,
}

struct GameState<S: StateType> {
    pub map_state: MapState<S>,
}

相关问题