![](/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.