Как я могу реализовать статический кеш в ржавчине? - PullRequest
1 голос
/ 24 июня 2019

Я хочу реализовать статический кеш в ржавчине.

Я пытался 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 = "stackoverflow-56728860"
version = "0.1.0"
authors = ["강동윤 <kdy1@outlook.kr>"]
edition = "2018"

[dependencies]
lazy_static = "1"
chashmap = "2"

github repo

Но я хочу вернуть статическую ссылку на данные из функции. Возвращенные данные зависят исключительно от ls. То есть, если ввод (ls) одинаков, результат будет таким же.

Кроме того, утечка данных в порядке, если снята блокировка чтения.

1 Ответ

0 голосов
/ 24 июня 2019

Я как-то решил это с утечкой.

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();
}

...