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