Rust中的 Cell 和 RefCell

在 Rust 中,Cell 和 RefCell 是用于实现内部可变性(interior mutability)的类型。它们允许在不使用可变引用的情况下改变数据。
Cell 和 RefCell 的功能类似,但在使用上有一些差异。
Cell 类型允许你在不使用可变引用的情况下修改包含的值。它通过提供 set 和 get 方法来实现。Cell 的值在赋值时可以进行复制,因为它实现了 Copy trait。但是,Cell 只能用于实现 Copy trait 的类型。

下面是一个使用 Cell 的示例:

rust 复制代码
use std::cell::Cell;

fn main() {
    let cell = Cell::new(5);
    let value = cell.get();
    println!("Initial value: {}", value);

    cell.set(10);
    let new_value = cell.get();
    println!("New value: {}", new_value);
}

在上面的示例中,我们创建了一个 Cell 实例 cell,并使用 get 方法获取初始值。然后,我们使用 set 方法将值修改为 10,并再次使用 get 方法获取新值。可以看到,我们并没有使用 mut 属性,依然可以修改值。

RefCell 类型也允许在不使用可变引用的情况下修改包含的值,但它提供了更多的灵活性。与 Cell 不同,RefCell 的值在赋值时不会进行复制,因此可以用于非 Copy 类型。RefCell 提供了 borrow 和 borrow_mut 方法,用于借用值的不可变引用和可变引用。这些方法在运行时执行借用规则的检查,并在违反规则时引发运行时错误。

下面是一个使用 RefCell 的示例:

rust 复制代码
use std::cell::RefCell;

fn main() {
    let cell = RefCell::new(5);

    {
        let value = cell.borrow();
        println!("Initial value: {}", *value);
    }

    {
        let mut value = cell.borrow_mut();
        *value = 10;
    }

    {
        let new_value = cell.borrow();
        println!("New value: {}", *new_value);
    }
}

在上面的示例中,我们创建了一个 RefCell 实例 cell。首先,我们使用 borrow 方法获取不可变引用,并打印初始值。然后,我们使用 borrow_mut 方法获取可变引用,并将值修改为 10。最后,我们再次使用 borrow 方法获取新值并打印。

需要注意的是,如果在运行时违反了借用规则,RefCell 会引发运行时错误 。这是与编译时借用规则(borrow rules)不同的一点。因此,在使用 RefCell 时,你需要确保在正确的作用域内使用借用方法,并避免出现悬垂引用(dangling references)和数据竞争(data races)的情况。

总之,Cell 和 RefCell 提供了一种在不使用可变引用的情况下修改数据的机制,用于特定的场景,如在不可变引用已经存在或不适用的情况下修改数据。

相关推荐
golang学习记14 小时前
rust开发,选VS Code还是RustRover?
开发语言·后端·rust
滕州市燕猫虎计算机科技工作室个体工商户15 小时前
《Rust程序设计》学习笔记二
rust·学习笔记
滕州市燕猫虎计算机科技工作室个体工商户16 小时前
《Rust程序设计》学习笔记三
rust·学习笔记·rust程序设计
geovindu16 小时前
rust: Facade Pattern
开发语言·后端·设计模式·rust·外观模式
福大大架构师每日一题16 小时前
Rust 1.99.0发布:C 可变参数、裸函数、Cargo 配置、Rustdoc 性能与大量兼容性调整全解析
c语言·开发语言·rust
DongQiShanRen17 小时前
裁决台账双向互校(下):台账哈希链、三向对账与最小落地
人工智能·深度学习·算法·目标跟踪·自然语言处理·rust·哈希算法
行者-全栈开发18 小时前
华为云码道 CodeArts 实测:让 AI 用 Rust 写一个 Git 仓库健康度体检台「仓衡」
git·rust·tauri·桌面应用·ai 编程·华为云码道·codearts 代码智能体
miofly18 小时前
GitHub 今日推荐|lightcraft:纯 Rust 重写的 RAW 照片开发工具
rust·开源·github
geovindu1 天前
rust: Abstract Factory pattern
开发语言·后端·设计模式·rust·抽象工厂模式
Hi202402172 天前
同一个 NMS 算子,两种语言实现:CUDA C 与 Rust 生成 LLVM IR 和 Vortex 汇编的差异
c语言·汇编·rust·gpgpu·vortex·cudac