1

编者注:此代码来自 Rust 1.0 之前的版本,在语法或语义上不是有效的 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;

是什么赋予了?

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

4

1 回答 1

3

你不能。

  • @是不可变的。
  • 托管盒子正在逐渐被摧毁,所以你不应该使用它们。
  • @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);

这不漂亮;智能指针特征可能会改善这种情况。但在可能的情况下,请避免此类事情。不可变数据很好,任务本地数据很好。

于 2014-02-21T01:06:00.057 回答