假设我有以下C enum:
enum TokenType {
Identifier = 256,
KeywordFunc = 257,
KeywordReturn = 258,
KeywordIf = 259,
KeywordElse = 260
};
枚举从256开始,所以我可以使用字符的文字ascii值,当我喜欢TokenType type = TokenType('{');
时,我如何在Rust中实现类似的东西?我现在有:
pub enum TokenType {
Identifier,
KeywordFunc,
KeywordReturn,
KeywordIf,
KeywordElse,
}
pub enum TokenTypeUnion {
Ascii(char),
NoneAscii(TokenType)
}
但也许有一个更习惯的解决方案?
为了简化使用,我只是将结构稍微扁平化一下:
pub enum TokenType {
Ascii(char),
Identifier,
KeywordFunc,
KeywordReturn,
KeywordIf,
KeywordElse,
}
fn use_enum() {
let token = TokenType::Ascii('}');
let token = TokenType::Return;
}
除了我看不出你的方法有什么改进的地方之外,它很地道。
您可以这样实现From
特性:
pub enum TokenType {
Identifier,
KeywordFunc,
KeywordReturn,
KeywordIf,
KeywordElse,
Ascii(char),
}
impl From<TokenType> for u16 {
fn from(tok_type: TokenType) -> u16 {
match tok_type {
TokenType::Identifier => 256,
TokenType::KeywordFunc => 257,
TokenType::KeywordReturn => 258,
TokenType::KeywordIf => 259,
TokenType::KeywordElse => 260,
TokenType::Ascii(char) => char as u16,
}
}
}
fn main() {
println!("{}", u16::from(TokenType::KeywordElse)); // 260
println!("{}", u16::from(TokenType::Ascii('}'))); // 125
}