铁锈不允许
不受控制的
,共享、可变访问。对于你的应用程序,你需要对时钟进行共享、可变的访问,所以你必须选择一种控制它的方法。
-
您可以将每个小部件放在
RefCell
,
Mutex
或
RwLock
以允许运行时检查变异。
fn main() {
let netstat = RefCell::new(NetworkStatus{});
let clock = RefCell::new(Clock{});
// note these are now `&` references, which may be shared
let widgets: Vec<&RefCell<dyn Widget>> = vec![
&netstat,
&clock,
];
loop {
for w in widgets.iter() {
w.borrow_mut().update_info();
}
for w in widgets.iter() {
w.borrow().render();
}
std::thread::sleep(clock.borrow().get_alignment_delay());
}
}
-
你可以记下时钟在矢量中的位置,然后将其访问为
widgets[index_of_the_clock].get_alignment_delay()
。如果用户可以添加和删除多个动画小部件,并且您想检查所有小部件的睡眠时间,那么这可能是有意义的。
-
您可以要求每个小部件都是内部可变的(也就是说,使用
RefCell
对于其自身的所有可变部分),使得
update()
只需要
&self
而不是
&mut self
。然后您可以与共享对小部件的访问权限
&
就像上面的代码示例一样,但不需要包装
RefCell
。(这可能不如第一种方案符合人体工程学。)
请注意,在所有这些情况下,您可能会发现使用引用向量是有限制的——特别是,如果您想让用户在程序运行时添加新的小部件,那么向量应该
拥有
小部件,而不是借用它们。这意味着矢量的类型为
Vec<Box<dyn Widget>>
(或者在情况1中,
Vec<Box<RefCell<dyn Widget>>>
). 这并不能阻止您更改小部件,因为
所有权
包括变异的能力。