[英]Hashmap value not updating on consecutive inserts [Rust]
我有一个包含各种路由器的结构。 主要是哈希图。 但是对于这个特定的 hashmap,插入后值不会更新。 没有删除 function。 只是一个插入功能(如下所示)。
这是主要结构
pub struct Router {
....
web_socket_routes: Arc<RwLock<HashMap<String, HashMap<String, (PyFunction, u8)>>>>,
}
这是一个吸气剂
#[inline]
pub fn get_web_socket_map(
&self,
) -> &Arc<RwLock<HashMap<String, HashMap<String, (PyFunction, u8)>>>> {
&self.web_socket_routes
}
这是插入方法
pub fn add_websocket_route(
&mut self,
route: &str,
connect_route: (Py<PyAny>, bool, u8),
close_route: (Py<PyAny>, bool, u8),
message_route: (Py<PyAny>, bool, u8),
) {
let table = self.get_web_socket_map();
let (connect_route_function, connect_route_is_async, connect_route_params) = connect_route;
let (close_route_function, close_route_is_async, close_route_params) = close_route;
let (message_route_function, message_route_is_async, message_route_params) = message_route;
let insert_in_router =
|handler: Py<PyAny>, is_async: bool, number_of_params: u8, socket_type: &str| {
let function = if is_async {
PyFunction::CoRoutine(handler)
} else {
PyFunction::SyncFunction(handler)
};
let mut route_map = HashMap::new();
route_map.insert(socket_type.to_string(), (function, number_of_params));
println!("socket type is {:?} {:?}", table, route);
table.write().unwrap().insert(route.to_string(), route_map);
};
insert_in_router(
connect_route_function,
connect_route_is_async,
connect_route_params,
"connect",
);
insert_in_router(
close_route_function,
close_route_is_async,
close_route_params,
"close",
);
insert_in_router(
message_route_function,
message_route_is_async,
message_route_params,
"message",
);
}
在所有 3 个insert_in_router
调用之后, web_socket_routes
只包含最后一个insert_in_router
调用的插入?
我尝试将Arc<RwLock<
更改为通用DashMap
,但我仍然面临同样的问题。
为什么会这样?
您的闭包每次都会无条件地创建一个新的内部HashMap
,并将其用作外部 hashmap 中的值。 但是,它将它放入外部 hashmap 中的同一键 ( route.to_string()
) 下所有 3 次,这导致每次插入都会覆盖前一个。
您需要实现一个逻辑,仅当缺少密钥时才会创建新的内部 hashmap。 然后它应该将值插入到内部 hashmap 中,要么是新创建的,要么是查找的。 在 Rust 中,这是使用条目 API 完成的:
table
.write()
.unwrap()
.entry(route.to_string())
.or_default()
.insert(socket_type.to_string(), (function, number_of_params))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.