#value #mutable #constant #smart-pointers

可变常量

对常量值的可变访问

2 个不稳定版本

0.1.0 2023年5月12日
0.0.1 2023年5月11日

#2619Rust 模式

24 次每月下载
用于 inscope

MIT/Apache

12KB
288

可变常量

此 crate 提供了一个智能指针,允许在指针不可变的情况下进行修改。

此 crate 非常新。虽然它不太可能发生重大变化,但它还不适合生产使用。

你为什么需要这个?

考虑以下示例

let mut x = 0;
let y = &x;

// Error: `x` already borrowed as immutable
x += 1;

在这个例子中,x 明显是值的拥有者,而 y 想要稍后引用该值。在大多数情况下,这个错误是合理的,因为 y 可能会在某个地方意外地改变。然而,在这种情况下,我们希望通过 y 知道 x 是否发生变化。常见的解决方案是使用类似 CellRefCell 的东西

let x = Cell::new(0);
let y = &x;

x.set(x.get() + 1);

这可以工作,但它不是非常方便。 CellRefCell 也不是非常高效,因为它们使用运行时检查来确保值没有被可变借用。有一些情况,这种做法是不可以接受的

  • 你想要一个基本引用的无成本抽象
  • 值通常是不可变的,但在特定情况下可以改变。除了这些情况之外,值应该是不可变的,并且这一点应该由编译器强制执行。
  • 你想要一个更清晰的解决方案,该方案清楚地传达了你的意图,包括可能的修改和值的生存期。

此 crate 提供了解决这些问题的方案。它不是 RefCell 的替代品。相反,它是对共享可变性的更便宜的替代方案,其中可变引用要么由编译器强制执行,要么显式地不安全。以下是如何在上面的情况下使用它

use mutable_constant::Mc;

let x = Mc::new(0);
let y = &x;

// This is unsafe, since `x` is already referenced
unsafe {
  *x.as_defiant_mut() += 1;
}

无运行时依赖