![](/img/trans.png)
[英]How can I select an enum variant based on a generic type that matches a type inside the variant?
[英]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 的情況嗎? 還是動力學? 語法是什么?
pub enum CellContent {
Move(Symbol),
None,
}
pub type CellContent = Option<Symbol>;
將問題擴展到上述結構,定義類似於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.