如何在 Rust 中实现静态缓存?
How can I implement static cache in rust?
我想用 Rust 实现静态缓存。
我试过了chashmap
extern crate chashmap;
extern crate lazy_static;
use chashmap::{CHashMap, ReadGuard};
use lazy_static::lazy_static;
use std::collections::HashMap;
struct Data {}
#[derive(Default)]
struct Merged {
types: HashMap<String, Data>,
}
fn merge(ls: &[String]) -> ReadGuard<'static, Vec<String>, Merged> {
lazy_static! {
static ref CACHE: CHashMap<Vec<String>, Merged> = Default::default();
}
let libs = ls.to_vec();
let merged = Merged::default();
CACHE.insert(libs, merged);
return CACHE.get(ls).unwrap();
}
fn get<'a>(ls: &[String], name: &str) -> Option<&'a Data> {
let lib = merge(ls);
if let Some(ty) = lib.types.get(name) {
return Some(&*ty);
}
None
}
fn main() {}
[package]
name = "Whosebug-56728860"
version = "0.1.0"
authors = ["강동윤 <kdy1@outlook.kr>"]
edition = "2018"
[dependencies]
lazy_static = "1"
chashmap = "2"
但我想 return 从函数静态引用数据。 returned 数据完全取决于 ls
。也就是说,如果输入 (ls
) 相同,则结果将相同。
此外,如果释放读锁,泄漏数据是可以的。
我以某种方式通过泄漏解决了它。
fn merge(ls: &[Lib]) -> &'static Merged {
lazy_static! {
static ref CACHE: CHashMap<Vec<Lib>, &'static Merged> = Default::default();
}
// ...
CACHE.insert(libs, Box::leak(merged));
return &*CACHE.get(ls).unwrap();
}
我想用 Rust 实现静态缓存。
我试过了chashmap
extern crate chashmap;
extern crate lazy_static;
use chashmap::{CHashMap, ReadGuard};
use lazy_static::lazy_static;
use std::collections::HashMap;
struct Data {}
#[derive(Default)]
struct Merged {
types: HashMap<String, Data>,
}
fn merge(ls: &[String]) -> ReadGuard<'static, Vec<String>, Merged> {
lazy_static! {
static ref CACHE: CHashMap<Vec<String>, Merged> = Default::default();
}
let libs = ls.to_vec();
let merged = Merged::default();
CACHE.insert(libs, merged);
return CACHE.get(ls).unwrap();
}
fn get<'a>(ls: &[String], name: &str) -> Option<&'a Data> {
let lib = merge(ls);
if let Some(ty) = lib.types.get(name) {
return Some(&*ty);
}
None
}
fn main() {}
[package]
name = "Whosebug-56728860"
version = "0.1.0"
authors = ["강동윤 <kdy1@outlook.kr>"]
edition = "2018"
[dependencies]
lazy_static = "1"
chashmap = "2"
但我想 return 从函数静态引用数据。 returned 数据完全取决于 ls
。也就是说,如果输入 (ls
) 相同,则结果将相同。
此外,如果释放读锁,泄漏数据是可以的。
我以某种方式通过泄漏解决了它。
fn merge(ls: &[Lib]) -> &'static Merged {
lazy_static! {
static ref CACHE: CHashMap<Vec<Lib>, &'static Merged> = Default::default();
}
// ...
CACHE.insert(libs, Box::leak(merged));
return &*CACHE.get(ls).unwrap();
}