编者注:此代码来自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;
是什么给出了?
如果切换到Owned Box指针,错误就会消失。这是对托管指针访问的某种限制吗?
答案 0 :(得分: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);
它不漂亮;智能指针特征可能会改善这种情况。但在可能的情况下,避免这样的事情不可变数据很好,任务本地数据很好。