簡體   English   中英

當通過共享框ptr訪問時,如何使我的struct字段可變?

[英]How do I make my struct fields mutable when accessing through a shared box ptr?

編者注:此代碼來自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指針,錯誤就會消失。 這是對托管指針訪問的某種限制嗎?

你不能。

  • @是不可變的。
  • 管理的盒子正在逐漸被破壞,所以你不應該使用它們。
  • @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);

它不漂亮; 智能指針特征可能會改善這種情況。 但在可能的情況下,避免這樣的事情 不可變數據很好,任務本地數據很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM