1

編集者注: このコードは 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;

何を与える?

所有ボックス ポインターに切り替えると、エラーはなくなります。これはマネージ ポインター アクセスに対するある種の制限ですか?

4

1 に答える 1

3

できません。

  • @不変です。
  • 管理ボックスはどんどん破壊されていくので使うべきではありません。
  • @mut言語から削除されました。

ただし、これを回避する方法がありますRefCell。オブジェクトをラップすると、変更できないように見えても変更できます。これは便利な場合もありますが、可能な限り避けるべきです。これを使用する例を次に示します ( with ;は適切に実装されていないため、現在は代わりにGc使用する傾向があるはずです)。RcGc

let steve = box(GC) RefCell::new(Monster { legs: 2 });
steve.borrow().borrow_mut().get().legs = 8;
assert_eq!(steve.borrow().borrow().get().legs, 8);

きれいではありません。スマート ポインターの特性は、状況を改善する可能性があります。しかし、可能な限り、そのようなことは避けてください。不変データは良いものであり、タスクローカル データは良いものです。

于 2014-02-21T01:06:00.057 に答える