匹配Rust中的Option静态字符串文字[duplicate]

问题描述 投票:0回答:1

编辑:事实证明,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(其中当然,这首先打破了使用静态字符串文字的目的。

或者有更好的方法来解决我想要解决的问题,我正在为一种语言制作解析器,并且很快,我正在编写令牌以及解析器/打印机。

string enums static rust optional
1个回答
2
投票

我认为这个问题就在于此问题

Some(literal) => print!(literal);

它应该是

Some(literal) => print!("{}", literal),

与你在无案例中所做的一样。

我相信println!使用格式!宏和根据rust docs

“第一个参数格式!receive是一个格式字符串。这必须是一个字符串文字。”

https://doc.rust-lang.org/std/macro.format.html

© www.soinside.com 2019 - 2024. All rights reserved.