匹配Rust中的Option静态字符串文字[duplicate]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了匹配Rust中的Option静态字符串文字[duplicate]相关的知识,希望对你有一定的参考价值。
编辑:事实证明,Rust编译器不够智能,无法传递有关变量是否静态定义的信息。在模式匹配时,编译器只知道它是一个String。
我正在尝试在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
(其中当然,这首先打破了使用静态字符串文字的目的。
或者有更好的方法来解决我想要解决的问题,我正在为一种语言制作解析器,并且很快,我正在编写令牌以及解析器/打印机。
我认为这个问题就在于此问题
Some(literal) => print!(literal);
它应该是
Some(literal) => print!("{}", literal),
与你在无案例中所做的一样。
我相信println!使用格式!宏和根据rust docs
“第一个参数格式!receive是一个格式字符串。这必须是一个字符串文字。”
https://doc.rust-lang.org/std/macro.format.html
以上是关于匹配Rust中的Option静态字符串文字[duplicate]的主要内容,如果未能解决你的问题,请参考以下文章