Rust 通过共享框ptr访问时,如何使结构字段可变?
编者注:此代码来自Rust 1.0之前的版本,在语法或语义上都不是有效的Rust 1.0代码 因此,确定共享框指针的范围是一个学习练习。纯粹的学术活动Rust 通过共享框ptr访问时,如何使结构字段可变?,rust,rust-obsolete,rust-0.9,Rust,Rust Obsolete,Rust 0.9,编者注:此代码来自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
#[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
Gc
一起使用;您目前可能倾向于使用Rc
,因为Gc
没有正确实现):
它不漂亮;聪明的指针特性很可能会改善这种情况。但在可能的情况下,避免这样的事情。不可变的数据是好的,任务本地数据是好的。@GregMalcolm要清楚,
@
的内容是一个不可变的槽,即y=@x
中的x
不能修改,即使y
是mut
。像RefCell
和Cell
这样的类型提供了“内部可变性”(RefCell
附带运行时检查,以确保没有违反&mut
指针的不变量:如果存在指向某个数据段的&mut
指针,则该数据段是唯一可以接触的路径。维护此不变量是共享类型的内容默认不可变的原因。)
let steve = box(GC) RefCell::new(Monster { legs: 2 });
steve.borrow().borrow_mut().get().legs = 8;
assert_eq!(steve.borrow().borrow().get().legs, 8);