为什么在将Rc <refcell <t >>放在后面后,动态闭包(作为特征对象的闭包)变得不可用?

时间:2019-05-24 16:48:32

标签: rust closures reference-counting interior-mutability

出于某些原因,我需要在<Rc<RefCell<T>>后面加上闭包:

  1. 多个对闭包的引用;
  2. 封闭可以改变环境(内部可变性);
  3. 更好地将闭包存储为特征对象,因为最终我想将引用放入向量中。

但是,闭包作为特征对象存储时变得不可用。

这里是一个例子。简单来说,变量closure不会改变环境。在我自己的用例中,我确实需要一个可变环境。

type Handler = FnMut(&mut u32);

let closure: rc::Rc<cell::RefCell<Handler>> = rc::Rc::new(cell::RefCell::new(|x: &mut u32|{
// would work if above line is:
// let closure: = rc::Rc::new(cell::RefCell::new(|x: &mut u32|{
    *x = 3;
}));

let mut y = 0u32;

let cc = closure.borrow_mut();

cc(&mut y);

我知道,如果删除变量closure上的类型约束,它会起作用。但是那样一来,我就失去了将类似的闭包放入vec的能力。

有没有办法在<Rc<RefCell<T>>后面使用闭包?还是有其他替代品可以满足我列出的3个要求?

0 个答案:

没有答案