2014-02-21 32 views
1

因此,將共享框指針作爲學習練習。純粹的學術演習。如何通過共享框ptr訪問時使我的結構字段可變?

#[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; 

是怎麼回事?

如果我切換到擁有框指針,錯誤消失。這是對託管指針訪問的某種限制嗎?

回答

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

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

+0

很高興有證實,謝謝! –

+2

@GregMalcolm明確地說,'@'的*內容*是一個不可變的槽,也就是說,即使'y'是'mut','y = @ x'中的'x'也不能被修改。像'RefCell'和'Cell'這樣的類型提供了「內部可變性」('RefCell'帶有運行時檢查以確保沒有違反'&mut'指針的不變量:如果一個數據段存在'&mut'指針,那麼這是數據可以被觸及的唯一路徑。維持這種不變是*爲什麼*默認情況下共享類型的內容是不可變的。) – huon