簡體   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