当通过共享框ptr访问时,如何使我的struct字段可变?

时间:2014-02-21 00:51:47

标签: rust rust-obsolete rust-0.9

  

编者注:此代码来自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指针,错误就会消失。这是对托管指针访问的某种限制吗?

1 个答案:

答案 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);

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