String 在Rust中匹配选项静态字符串文字

String 在Rust中匹配选项静态字符串文字,string,enums,static,rust,optional,String,Enums,Static,Rust,Optional,编辑:事实证明,Rust编译器不够聪明,无法携带有关变量是否静态定义的信息。在模式匹配时,编译器只知道它是一个字符串 我正在尝试用Rust制作一个解析器,并且我已经定义了一个标记枚举 pub enum Constant { String(String), } pub enum Token { KwIf, KwThen, KwElse, Constant(Constant), } 我还编写了一个literal函数,重要的一点是该函数返回静态字符串(即&'

编辑:事实证明,Rust编译器不够聪明,无法携带有关变量是否静态定义的信息。在模式匹配时,编译器只知道它是一个字符串

我正在尝试用Rust制作一个解析器,并且我已经定义了一个
标记
枚举

pub enum Constant {
    String(String),
}

pub enum Token {
    KwIf,
    KwThen,
    KwElse,
    Constant(Constant),
}
我还编写了一个
literal
函数,重要的一点是该函数返回静态字符串(即
&'static str
),因为性能原因(字符串也不会改变,所以在程序的整个生命周期中保持不变是有意义的)

问题是,当我试图打印这个文本时,我得到了一个编译错误,即我得到的编译错误是
error:format参数必须是一个字符串文本。
我尝试了许多组合,如何打印静态字符串文本,而不必将其转换为正常的
字符串(这当然会首先破坏使用静态字符串文字的目的)


或者,有没有更好的方法来解决我试图解决的问题,我正在为一种语言制作一个解析器,并且很快,我也在为解析器/打印机编写标记。

我认为问题在于这一行

Some(literal) => print!(literal);
应该是

Some(literal) => print!("{}", literal),
和你在None案中做的一样

我相信println!使用了format!宏,并且根据rust文档

“第一个参数format!receives是一个格式字符串。它必须是字符串文字。”


我认为问题出在这条线路上

Some(literal) => print!(literal);
应该是

Some(literal) => print!("{}", literal),
和你在None案中做的一样

我相信println!使用了format!宏,并且根据rust文档

“第一个参数format!receives是一个格式字符串。它必须是字符串文字。”


我知道你可以做
Some(literal)=>print!(“{}”,literal),
,问题是
literal
值是一个字符串静态文本,因此
print!(literal)
应该可以工作。除非我弄错了,如果你做
print!(“{}”,literal)
,这首先就破坏了使用字符串静态文本的意义,因为它的性能最差(因为您将要将字符串静态文本转换为普通字符串)。要清楚,如果您不使用
选项
代码工作正常,
打印!(文本)
将起作用,因为编译器可以推断出它是一个静态字符串文字。你确定有效吗?我尝试了
let f=“Hello”;println!(f)
并得到“error:expected a literal”。据我所知,literal是源代码中出现的实际值。在匹配语句中,您创建了一个名为literal的新绑定,但它实际上不是一个literal值,因此出现了错误。@mdedetrich
literal
不是一个literal。例如,请阅读并感谢链接,我意识到ust编译器不够聪明,无法判断它仍然是一个静态文字字符串。rust编译器在AST中携带类型信息,但不知道变量是否静态定义为文字。@mdedetrich格式参数to
print!
实际上是代码(一种域特定语言),而不是数据。
print!
宏根据其值生成不同的代码,即它是一个将DSL转换为rust的编译器。因此,
print!
的每个宏扩展必须只有一个可能的DSL程序。据我所知,您可以执行
Some(literal)=>print!(“{}”,literal),
,问题是
literal
值是一个字符串静态文本,因此
print!(literal)
应该可以工作。除非我弄错了,否则如果您执行
print!(“{}”,literal)
,这首先就破坏了使用字符串静态文本的意义,因为它的性能最差(因为您将要将字符串静态文本转换为普通字符串)。要明确的是,如果您不使用
选项
代码工作正常,
print!(literal)
将工作,因为编译器可以推断它是静态字符串文本。您确定工作正常吗?我尝试了
let f=“Hello”;println!(f)
并得到“error:expected a literal”。据我所知,literal是源代码中出现的实际值。在匹配语句中,您创建了一个名为literal的新绑定,但它实际上不是一个literal值,因此出现了错误。@mdedetrich
literal
不是一个literal。例如,请阅读并感谢链接,我意识到ust编译器不够聪明,无法判断它仍然是一个静态文字字符串。rust编译器在AST中携带类型信息,但不知道变量是否静态定义为文字。@mdedetrich格式参数to
print!
实际上是代码(一种域特定语言),而不是数据。
print!
宏根据其值生成不同的代码,即它是一个将DSL转换为rust的编译器。因此,
print!
的每个宏扩展必须只有一个可能的DSL程序。