前段時間託管盒裝有他們自己的可變性「等級」。下面的代碼用於工作:
#[feature(managed_boxes)];
enum State { A(int), B }
fn main() {
let state = @mut A(123);
match *state {
A(ref mut i) => { *i = 456 }
B => { }
}
println!("{:?}", state)
}
但是託管盒計劃從語言中刪除。在當前版本的Rust @mut
不是有效的標記。您必須使用RefCell
,這是一種在託管指針內部提供可變性的可變單元。目前,它看起來有點像這樣:
#[feature(managed_boxes)];
use std::cell::RefCell;
enum State { A(int), B }
fn main() {
let state = @RefCell::new(A(123));
{
let mut r = state.borrow_mut();
match r.get() {
&A(ref mut i) => { *i = 456 }
&B => { }
}
}
println!("{:?}", state)
}
你會得到相當廣泛的輸出端上,但因爲它會打印RefCell
結構的內部。有關單元的更多信息以及如何使用它們,請參閱documentation on std::cell模塊。
在未來,Rust根本沒有託管框的特殊語法。垃圾收集將在圖書館中實施。我相信代碼將如下所示(Rust作者,請糾正我,如果我錯了):
use std::cell::RefCell;
enum State { A(int), B }
fn main() {
// state is of type Gc<RefCell<State>>
let state = box(Gc) RefCell::new(A(123));
// Dereference will work for library pointer types, not sure about autodereference
let mut r = (*state).borrow_mut();
match r.get() {
&A(ref mut i) => { *i = 456 }
&B => { }
}
println!("{:?}", *state)
}