在使用 lazy_static crate 初始化静态变量期间,宏调用中没有规则需要此令牌

no rules expected this token in macro call during initialization of static variable using lazy_static crate

提问人:Harry 提问时间:10/26/2022 最后编辑:Harry 更新时间:10/26/2022 访问量:96

问:

我正在尝试使用 crate 在运行时初始化静态变量。但是我在编译时遇到错误。这是我关注lazy_static链接lazy_staticno rules expected the token E1

use lazy_static::lazy_static;

lazy_static! {
    static E1: f64 = (1.0 - f64::sqrt(1.5)) / (1.0 + f64::sqrt(0.5));
}

fn main() {
    println!("{}", E1);
}
惰性静态

评论


答:

1赞 Chayim Friedman 10/26/2022 #1

语法为:。请注意 .static ref NAME: Type = expr;ref

1赞 Lukas Kalbertodt 10/26/2022 #2

您在 .这只是一些自定义语法,以表达这种静态工作有点不同,只能通过引用访问。refstaticlazy_static

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);
    //             ^
}

这也是您需要取消引用该值的原因,因为静态变量是不透明的类型。在许多情况下,这不是必需的,因为类型实现 。但就在这里。Deref<Target = f64>

还可以考虑使用 once_cell,它可以让您实现相同的事情,但没有宏。

评论

0赞 Harry 10/26/2022
考虑到性能(或)您更喜欢哪一个?lazy_staticonce_cell
0赞 Lukas Kalbertodt 10/26/2022
@Harry我认为在性能方面,它们完全相同。(我还没有看到任何基准测试,但据我所知,这是相当简单的)。我更喜欢,因为我可以摆脱宏。once_cell