rust - 通过共享框 ptr 访问时如何使我的结构字段可变?

标签 rust rust-obsolete rust-0.9

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/

相关文章:

rust - 无法构建 Hyper - crate 名称中的无效字符 `-`

rust - "borrowed value does not live long enough"将结构与切片一起使用时

Rust 0.9——读取文件?

rust - 两次通过闭包而没有被移走

vector - 从借用的 Vec 中删除值时,如何避免从借用中移出?

rust - 为什么可能会出现 `#NP` 错误,期望 IDT 条目位于索引 302 处?

rust - 使用字符串访问向量元素

rust - 如何将枚举值与整数匹配?