[英]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.