rust cannot call non-const fn `HashMap::<std::string::String, Arc<dyn MethodCall>>::new` in statics
时间: 2023-08-06 15:05:56 浏览: 345
在 Rust 中,静态变量必须是编译时常量,而 `HashMap::<std::string::String, Arc<dyn MethodCall>>::new()` 是一个非编译时常量的函数调用,因此会导致编译错误。
解决这个问题的方法是,使用 `lazy_static` 库来创建懒加载静态变量。`lazy_static` 可以在运行时初始化静态变量,因此可以绕过 Rust 的编译时常量限制。
下面是一个使用 `lazy_static` 创建静态 `HashMap` 变量的例子:
```rust
use std::collections::HashMap;
use std::sync::Arc;
lazy_static::lazy_static! {
static ref MY_MAP: HashMap<String, Arc<dyn MethodCall>> = HashMap::new();
}
fn main() {
// 在需要使用静态变量时,可以直接使用 MY_MAP
// MY_MAP 会在第一次使用时被初始化
MY_MAP.insert("foo".to_string(), Arc::new(Foo));
}
```
在这个例子中,我们使用 `lazy_static` 宏来创建一个名为 `MY_MAP` 的静态变量。`MY_MAP` 的类型是 `HashMap<String, Arc<dyn MethodCall>>`,它会在第一次使用时被初始化为一个空的 `HashMap`。在 `main` 函数中,我们使用 `MY_MAP` 来向其中插入一个元素。由于 `lazy_static` 会在第一次使用时初始化静态变量,因此这个元素会被插入到 `MY_MAP` 中。
需要注意的是,`lazy_static` 会使用锁来保证初始化的线程安全性。这可能会导致一些性能损失,因此只有在必要时才应该使用 `lazy_static`。
阅读全文