我正在用Rust编写一个解析器,并向char
添加了一些快捷函数,用于创建特定的单字符标记:
impl CharToToken for char {
fn to_token(&self, pos: usize) -> Token {
match *self {
'{' => Token {
token_type: TokenType::CurlyBraceOpen,
span: (pos, pos),
text: "{",
},
'}' => Token {
token_type: TokenType::CurlyBraceClose,
span: (pos, pos),
text: "}",
},
';' => Token {
token_type: TokenType::SemiColon,
span: (pos, pos),
text: ";",
},
_ => panic!("Can't create a token from char {:?}", self),
}
}
}
这里的预期用例只是为了节省一些打字时间.而不是写:
tokens.push(Token {
token_type: TokenType::CurlyBraceOpen,
span: (cursor, cursor),
text: "{",
})
我可以只写:
tokens.push('{'.to_token(cursor));
这里唯一的缺点是,类型系统并不能使我免于编写'X'.to_token(123)
和使应用程序崩溃,而且我真的不想返回Result
,从而使我的逻辑更加冗长.我宁愿类型系统从一开始就阻止我写错东西.
有没有办法指示编译器,这个函数应该只在字符文字'{'
、'}'
和';'
上调用,而不是允许任何char
?