2 个不稳定版本
0.1.0 | 2023年5月12日 |
---|---|
0.0.1 | 2023年5月11日 |
#2619 在 Rust 模式 中
24 次每月下载
用于 inscope
12KB
288 行
可变常量
此 crate 提供了一个智能指针,允许在指针不可变的情况下进行修改。
此 crate 非常新。虽然它不太可能发生重大变化,但它还不适合生产使用。
你为什么需要这个?
考虑以下示例
let mut x = 0;
let y = &x;
// Error: `x` already borrowed as immutable
x += 1;
在这个例子中,x
明显是值的拥有者,而 y
想要稍后引用该值。在大多数情况下,这个错误是合理的,因为 y
可能会在某个地方意外地改变。然而,在这种情况下,我们希望通过 y
知道 x
是否发生变化。常见的解决方案是使用类似 Cell
或 RefCell
的东西
let x = Cell::new(0);
let y = &x;
x.set(x.get() + 1);
这可以工作,但它不是非常方便。 Cell
和 RefCell
也不是非常高效,因为它们使用运行时检查来确保值没有被可变借用。有一些情况,这种做法是不可以接受的
- 你想要一个基本引用的无成本抽象
- 值通常是不可变的,但在特定情况下可以改变。除了这些情况之外,值应该是不可变的,并且这一点应该由编译器强制执行。
- 你想要一个更清晰的解决方案,该方案清楚地传达了你的意图,包括可能的修改和值的生存期。
此 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;
}