【发布时间】:2018-03-03 14:31:42
【问题描述】:
编辑:事实证明,Rust 编译器不够聪明,无法传递有关变量是否是静态定义的信息。在您进行模式匹配时,编译器只知道它是一个字符串。
我正在尝试在 Rust 中创建一个解析器,并且我已经定义了一个 Token 枚举。
pub enum Constant {
String(String),
}
pub enum Token {
KwIf,
KwThen,
KwElse,
Constant(Constant),
}
我还写了一个literal函数,重要的是这个函数返回静态字符串(即&'static str),由于性能原因(字符串也永远不会改变,所以它们保持不变是有意义的整个程序的生命周期)。
impl Token {
pub fn literal(&self) -> Option<&'static str> {
match self {
&Token::KwIf => Some("if"),
&Token::KwThen => Some("then"),
&Token::KwElse => Some("else"),
_ => None,
}
}
}
我现在遇到的问题是,你将如何与 literal 函数进行模式匹配并使用 rust print! 函数直接打印文字字符串,即假设我写了这样的内容
use Constant::*;
pub fn print_token(token: Token) {
match token.literal() {
Some(literal) => print!(literal);
None => match token {
Token::Constant(constant) => match constant {
String(string) => print!("{}", string),
_ => panic!("Unexpected token"),
}
}
}
}
问题是当我尝试打印此文字时出现编译错误,即我得到的编译错误是error: format argument must be a string literal. 我已经尝试了许多如何打印静态字符串文字的组合,而无需将其转换为正常的String(这当然违背了首先使用静态字符串文字的目的)。
或者,是否有更好的方法来解决我要解决的问题,我正在为一种语言制作解析器,并且很快,我正在编写令牌以及解析器/打印机。
【问题讨论】:
标签: string enums static rust optional