MST

星途 面试题库

面试题:Rust中特征、生命周期与泛型的深度融合

设计一个通用的缓存系统,使用Rust实现。该缓存系统要支持不同类型的数据存储,这些数据类型需实现一个自定义特征`Cacheable`,该特征有方法`get_key`用于获取缓存的键。缓存系统需处理好数据的生命周期问题,防止数据提前释放导致空指针等错误。同时,缓存系统要支持动态添加和删除缓存项。请用泛型、特征和生命周期相关知识完整实现这个缓存系统,包括必要的测试代码。
39.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::collections::HashMap;

// 定义Cacheable特征
trait Cacheable {
    fn get_key(&self) -> String;
}

// 缓存系统结构体
struct Cache<T: Cacheable> {
    data: HashMap<String, Box<T>>,
}

impl<T: Cacheable> Cache<T> {
    // 添加缓存项
    fn add(&mut self, item: T) {
        let key = item.get_key();
        self.data.insert(key, Box::new(item));
    }

    // 删除缓存项
    fn remove(&mut self, key: &str) {
        self.data.remove(key);
    }

    // 获取缓存项
    fn get(&self, key: &str) -> Option<&T> {
        self.data.get(key).map(|item| &**item)
    }
}

// 测试代码
#[cfg(test)]
mod tests {
    use super::*;

    struct TestItem {
        key: String,
    }

    impl Cacheable for TestItem {
        fn get_key(&self) -> String {
            self.key.clone()
        }
    }

    #[test]
    fn test_cache() {
        let mut cache = Cache::<TestItem> {
            data: HashMap::new(),
        };

        let item1 = TestItem {
            key: "item1".to_string(),
        };
        cache.add(item1);

        assert!(cache.get("item1").is_some());

        cache.remove("item1");
        assert!(cache.get("item1").is_none());
    }
}