- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试创建一个 HashMap
并将函数作为值:
#[macro_use]
extern crate lazy_static;
use std::collections::HashMap;
lazy_static! {
static ref HASHES: HashMap<&'static str, &'static Fn([u8])> = {
let mut m = HashMap::new();
m.insert("md5", &md5);
m
};
}
fn md5(bytes: &[u8]) -> String {
String::default()
}
编译器给我一个错误:
error[E0277]: the trait bound `std::ops::Fn([u8]) + 'static: std::marker::Sync` is not satisfied in `&'static std::ops::Fn([u8]) + 'static`
--> src/main.rs:6:1
|
6 | lazy_static! {
| _^ starting here...
7 | | static ref HASHES: HashMap<&'static str, &'static Fn([u8])> = {
8 | | let mut m = HashMap::new();
9 | | m.insert("md5", &md5);
10 | | m
11 | | };
12 | | }
| |_^ ...ending here: within `&'static std::ops::Fn([u8]) + 'static`, the trait `std::marker::Sync` is not implemented for `std::ops::Fn([u8]) + 'static`
|
= note: `std::ops::Fn([u8]) + 'static` cannot be shared between threads safely
= note: required because it appears within the type `&'static std::ops::Fn([u8]) + 'static`
= note: required because of the requirements on the impl of `std::marker::Sync` for `std::collections::hash::table::RawTable<&'static str, &'static std::ops::Fn([u8]) + 'static>`
= note: required because it appears within the type `std::collections::HashMap<&'static str, &'static std::ops::Fn([u8]) + 'static>`
= note: required by `lazy_static::lazy::Lazy`
= note: this error originates in a macro outside of the current crate
我不明白我应该怎么做才能修复这个错误,我不知道创建这样一个 HashMap
的任何其他方法。
最佳答案
您的代码有多个问题。编译器出现的错误告诉您您的代码将允许内存不安全:
`std::ops::Fn([u8]) + 'static` cannot be shared between threads safely
您存储在 HashMap
中的类型不能保证它可以被共享。
您可以通过将您的值类型更改为 &'static (Fn([u8]) + Sync)
来指定这样的界限来“修复”这个问题。由于您的函数签名不匹配,这将解锁下一个错误:
expected type `std::collections::HashMap<&'static str, &'static std::ops::Fn([u8]) + std::marker::Sync + 'static>`
found type `std::collections::HashMap<&str, &fn(&[u8]) -> std::string::String {md5}>`
“修复”&'static (Fn(&[u8]) -> String + Sync)
会导致深奥的生命周期错误:
expected type `std::collections::HashMap<&'static str, &'static for<'r> std::ops::Fn(&'r [u8]) -> std::string::String + std::marker::Sync + 'static>`
found type `std::collections::HashMap<&str, &fn(&[u8]) -> std::string::String {md5}>`
这可以通过将带有 &md5 的函数转换为 &'static (Fn(&[u8]) -> String + Sync))
来“修复”,这会导致
note: borrowed value must be valid for the static lifetime...
note: consider using a `let` binding to increase its lifetime
这是因为 the reference you've made is to a temporary value that doesn't live outside of the scope 触底反弹.
我将 fix 放在引号中,因为这不是真正正确的解决方案。正确的做法是只使用函数指针:
lazy_static! {
static ref HASHES: HashMap<&'static str, fn(&[u8]) -> String> = {
let mut m = HashMap::new();
m.insert("md5", md5 as fn(&[u8]) -> std::string::String);
m
};
}
老实说,我会说 HashMap
可能有点矫枉过正;我会使用一个数组。小型数组可能比小型 HashMap
更快:
type HashFn = fn(&[u8]) -> String;
static HASHES: &'static [(&'static str, HashFn)] = &[
("md5", md5),
];
您可以从遍历列表开始,或者花点时间将其按字母顺序排列,然后使用 binary_search
当它变大时。
关于rust - 如何创建一个以函数引用为值的 lazy_static HashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43307019/
我使用 lazy_static 在内存中保存一个 HashMap。我使用两种方法添加和获取元素,但我在生命周期方面遇到了一些问题。 这是我的代码: #[macro_use] extern crate
我正在尝试使用递归公用表表达式(大约80行SELECT语句)集成一个相当复杂的SQL查询。有两个不同的查询可以为递归设置种子。我不想在我的代码中嵌入两个不同的80行SQL语句,它们之间只有一行不同,谢
#[derive(Serialize)] pub struct SLPInfoVersion { name: String, protocol: i32 } impl SLPInfoV
我尝试创建一个 HashMap 并将函数作为值: #[macro_use] extern crate lazy_static; use std::collections::HashMap; lazy_
我有一个大项目,我在其中使用 lazy_static 创建一个 singleton。我认为 lazy_static crate 中存在错误(仅出现在大型项目中)或者我做错了什么,因为必须调用一次以创建
如果我取消注释 create_log,log 和 LOG 都会打印在控制台上。没有它,什么也不会打印。这是怎么回事? #[macro_use] extern crate slog; extern cr
我是 Rust 的新手。我正在将 mongodb 与异步运行时(tokio)一起使用。 我想全局初始化 mongo 客户端,所以我使用了一个名为 lazy_static 的 crate .问题是mon
我正在尝试使用 lazy_static crate 初始化一些静态变量,这些变量通过读取 build.rs 中的一些环境变量来赋值。我想要实现的类似于 this post . 我的代码如下: lazy
我想将一些 json 读入静态 HashMap ,并且正在使用 lazy_static和 serde ,但我不知道如何(如果有的话)解决这个 serde终身问题: #[macro_use] exter
这个问题在这里已经有了答案: Why does a lazy-static value claim to not implement a trait that it clearly implemen
我想分享一个 evmap ,一个无锁的、最终一致的、并发的多值映射,跨 Rust 程序中的所有线程。 天真地,它看起来像这样: #[macro_use] extern crate lazy_stati
这个问题在这里已经有了答案: Trying to return reference from RwLock, "borrowed value does not live long enough" E
我正在使用模拟函数编写测试,使用 Mutex 控制测试之间的返回值: #[macro_use] extern crate lazy_static; #[cfg(test)] pub use mock:
这段代码: #[macro_use] extern crate lazy_static; extern crate mysql; use mysql::*; fn some_fn() { la
我正在使用 Rust,为了方便起见,我想使用一个全局可变的 HashMap。然而,虽然可以使用 lazy_static 和 Mutex 定义一个全局的、可变的 HashMap,但是对于我的 Strin
我是一名优秀的程序员,十分优秀!