MST

星途 面试题库

面试题:Rust内部可变性之缓存场景应用

假设你正在开发一个缓存系统,需要在不可变的结构体中存储可变的缓存数据。请用Rust代码展示如何利用内部可变性来实现这一需求,要求简要解释所使用的内部可变性相关的类型和机制。
11.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::cell::Cell;

struct Cache {
    data: Cell<Option<String>>,
}

impl Cache {
    fn new() -> Cache {
        Cache { data: Cell::new(None) }
    }

    fn set(&self, value: String) {
        self.data.set(Some(value));
    }

    fn get(&self) -> Option<String> {
        self.data.get().clone()
    }
}

fn main() {
    let cache = Cache::new();
    cache.set("example".to_string());
    println!("Cache value: {:?}", cache.get());
}

内部可变性相关的类型和机制解释

  1. Cell
    • Cell 类型提供了内部可变性的一种基本形式。它允许在不可变引用上进行修改操作。在这个例子中,Cache 结构体是不可变的,但通过 Cell<Option<String>>,我们可以修改 data 字段的值。
    • Cell 只能用于存储实现了 Copy 语义的类型,对于非 Copy 类型(如 String),Cell 内部存储的是值的拷贝,set 方法会替换内部存储的值,get 方法会返回内部值的拷贝。
  2. 不可变结构体中的可变数据
    • 通常情况下,不可变结构体的字段也是不可变的。但通过 Cell,我们打破了这种常规,实现了在不可变结构体 Cache 中对 data 字段的可变操作。这样,即使 cache 变量是不可变的,我们仍然可以调用 cache.set 方法来更新缓存数据。