提问人:Harry 提问时间:10/26/2022 最后编辑:Harry 更新时间:10/26/2022 访问量:96
在使用 lazy_static crate 初始化静态变量期间,宏调用中没有规则需要此令牌
no rules expected this token in macro call during initialization of static variable using lazy_static crate
问:
我正在尝试使用 crate 在运行时初始化静态变量。但是我在编译时遇到错误。这是我关注lazy_static链接lazy_static
no 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
您在 .这只是一些自定义语法,以表达这种静态工作有点不同,只能通过引用访问。ref
static
lazy_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_static
once_cell
0赞
Lukas Kalbertodt
10/26/2022
@Harry我认为在性能方面,它们完全相同。(我还没有看到任何基准测试,但据我所知,这是相当简单的)。我更喜欢,因为我可以摆脱宏。once_cell
评论