繁体   English   中英

如何将类型声明为“枚举变体之一或无”?

[英]How do I declare a type as "one of an enum variant or a None"?

我将问题简化为这种情况。 想象一下经典的井字游戏 / tris 游戏。

玩家可以使用 X 或 O。

pub enum Symbol {
    X,
    O,
}

在考虑单元格内容时,我认为用户可以玩的 9 个位置之一,用人类的术语来说是

  • 一个单元格可以包含一个Symbol::X 、一个Symbol::O或一个None (当它还没有播放时)

如何将此内容表示为类型/枚举/结构?

这是我们可以使用 Generics 的情况吗? 还是动力学? 语法是什么?

选项1

pub enum CellContent {
    Move(Symbol),
    None,
}

选项 2

pub type CellContent = Option<Symbol>;

选项 3(来自接受的答案)

将问题扩展到上述结构,定义类似于Option<Symbol>的东西

个人笔记

选项2,作为一种类型,带来的缺点是我们无法实现这种类型的功能,所以我们不能使用它,因为我们需要比较等。

您可以将Symbol枚举放在Option内,即: Option<Symbol>

// your 3x3 table
let mut table: [[Option<Symbol>; 3]; 3] = Default::default();

最初, table中的所有单元格都将为None 然后,播放:

table[1][1] = Some(Symbol::X);
table[1][2] = Some(Symbol::O);

或者,您可以通过将Symbol定义为以下方式来遵循侵入性方法:

pub enum Symbol {
    NotPlayedYet,
    X,
    O,
}

也就是说,定义一个额外的变体Symbol::NotPlayedYet 对于这种情况,您可能希望为Symbol实现Default以默认为Symbol::NotPlayedYet

impl Default for Symbol {
    fn default() -> Self {
        Symbol::NotPlayedYet
    }
}

这样玩:

let mut table: [[Symbol; 3]; 3] = Default::default();

table[1][1] = Symbol::X;
table[1][2] = Symbol::O;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM