Editor's note: This code is from a version of Rust prior to 1.0 and is not syntactically or semantically valid Rust 1.0 code.
因此,确定共享框指针的范围是一项学习练习。纯粹的学术练习。
#[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 指针,错误就会消失。这是对托管指针访问的某种限制吗?
最佳答案
你不能。
@
是不可变的。- 受管理的盒子正在逐渐被销毁,所以你不应该使用它们。
@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);
它不漂亮;智能指针特性可能会改善这种情况。但在可能的情况下,避免这样的事情。不可变数据很好,任务本地数据很好。
关于rust - 通过共享框 ptr 访问时如何使我的结构字段可变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21922991/