使用lazy_static crate初始化静态变量时遇E1编译错误求助
问题解决:lazy_static编译错误「no rules expected the token E1」
你的代码编译报错的核心原因是lazy_static宏要求静态变量必须用static ref声明,而非普通的static。lazy_static的设计是通过延迟初始化生成一个引用类型的静态实例,因此必须添加ref关键字。
修正后的代码如下:
use lazy_static::lazy_static; lazy_static! { static ref E1: f64 = (1.0 - f64::sqrt(1.5)) / (1.0 + f64::sqrt(0.5)); } fn main() { println!("{}", *E1); }
需要注意的是,因为E1现在是引用类型,打印时需要用*进行解引用(不过lazy_static生成的类型实现了Deref trait,直接写println!("{}", E1)也能正常运行,解引用写法更直观)。
lazy_static的核心作用是创建支持运行时初始化的静态引用,必须严格遵循static ref 变量名: 类型 = 初始化表达式的语法规则。普通static变量在Rust中要求初始化值必须是编译期可计算的常量,而lazy_static通过ref关键字绕开了这个限制,实现运行时的延迟初始化。
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

