如何使我的结构字段在通过共享框 ptr 访问时可变



编者注:此代码来自 1.0 之前的 Rust 版本,在语法或语义上都不是有效的 Rust 1.0 代码。

因此,将共享框指针的范围界定为学习练习。纯粹的学术练习。

#[feature(managed_boxes)];
struct Monster {
    legs: int
}
fn main() {
    let mut steve = @Monster{ legs: 2 };
    steve.legs = 8;
}
收到

这个编译器错误有点惊讶:

shared_box.rs:10:5: 10:15 error: cannot assign to immutable field
shared_box.rs:10     steve.legs = 8;

什么给?

如果我切换到拥有的框指针,错误就会消失。这是对托管指针访问的某种限制吗?

你不能。

  • @是不可变的。
  • 托管盒子正在被逐步销毁,因此您不应该使用它们。
  • @mut已从语言中删除。

但是,有一种方法可以解决这个问题: RefCell .如果将对象包装在其中,则可以对其进行修改,即使它看起来是不可变的。这有时很有用,但在可能的情况下,您应该避免它。下面是使用它的示例(使用 Gc ;您目前可能应该倾向于使用 Rc,因为Gc没有正确实现):

let steve = box(GC) RefCell::new(Monster { legs: 2 });
steve.borrow().borrow_mut().get().legs = 8;
assert_eq!(steve.borrow().borrow().get().legs, 8);

这并不漂亮;聪明的指针特征可能会很好地改善这种情况。但在可能的情况下,避免这样的事情。不可变数据是好的,任务本地数据是好的。

最新更新