Cell和RefCell

Cell和RefCell

Rust 提供了 CellRefCell 用于内部可变性,简而言之,可以在拥有不可变引用的同时修改目标数据,对于正常的代码实现来说,这个是不可能做到的(要么一个可变借用,要么多个不可变借用)。

内部可变性的实现是因为 Rust 使用了 unsafe 来做到这一点,但是对于使用者来说,这些都是透明的,因为这些不安全代码都被封装到了安全的 API 中

Cell

CellRefCell 在功能上没有区别,区别在于 Cell< T > 适用于 T 实现 Copy 的情况:

rust 复制代码
use std::cell::Cell;
fn main() {
  let c = Cell::new("asdf");
  let one = c.get();
  c.set("qwer");
  let two = c.get();
  println!("{},{}", one, two);

asdf,qwer
}

以上代码展示了 Cell 的基本用法,有几点值得注意:

  • "asdf" 是 &str 类型,它实现了 Copy 特征
  • c.get 用来取值,c.set 用来设置新值

取到值保存在 one 变量后,还能同时进行修改,这个违背了 Rust 的借用规则,但是由于 Cell 的存在,我们很优雅地做到了这一点,但是如果你尝试在 Cell 中存放String

rust 复制代码
 let c = Cell::new(String::from("asdf"));

编译器会立刻报错,因为 String 没有实现 Copy 特征

RefCell

相关推荐
木木木一1 小时前
Rust学习记录--C0 总目录
开发语言·学习·rust
Mr -老鬼2 小时前
Java、Go、Rust高并发时代“称雄”之战:场景适配与生态博弈
java·golang·rust
几颗流星2 小时前
使用 Rust + Axum 构建灵活的 API 模拟服务器
后端·rust
Yuer20253 小时前
时间不是索引:Rust 量化算子中的 Time Semantics 与窗口模型
rust·金融量化·可控ai
Yuer20254 小时前
批处理不是循环:Rust 量化算子中的 Batch Consistency 与向量化执行语义
rust·金融量化·可控ai
全栈前端老曹4 小时前
【包管理】npm最常见的10大问题故障和解决方案
前端·javascript·rust·npm·node.js·json·最佳实践
Yuer20254 小时前
状态不是变量:Rust 量化算子中的 State 工程语义
开发语言·后端·深度学习·机器学习·rust
勇敢牛牛_4 小时前
repr(C):解决FFI的内存布局差异
rust·aiway
古城小栈4 小时前
Rust 交叉编译:MacOS ====> Linux (musl 静态编译)
linux·macos·rust
FAFU_kyp20 小时前
Rust 的 引用与借用
开发语言·算法·rust