Rust 通过共享框ptr访问时,如何使结构字段可变?

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

编者注:此代码来自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;
有什么好处

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

您不能

  • @
    是不可变的
  • 托管箱正在稳步销毁,因此您不应该使用它们
  • @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);