我想将一个FnOnce闭包传递给稍后要使用的对象,但我想避免任何堆分配.我可以通过将闭包保持在堆栈上来避免堆分配.但问题是我无法传递对象的引用,因为它FnOnce call_once消耗了闭包.所以我需要在Box没有堆分配的情况下传递一个拥有的指针(例如).
这可能吗?我想做的是:
fn main() {
let mut scheduler = NoHeapScheduler();
// allocate the task on the stack
let task = move ||;
// somehow pass ownership of the closure, while keeping it allocated on the stack.
scheduler.add_task(StaticBox::new(task));
schedule.run();
}
Run Code Online (Sandbox Code Playgroud)
据我所知,只要调度程序没有超过任务,这应该是安全的.有没有办法让这种情况发生?
我可以使用 anOption来做到这一点。我可以将 保留Option在堆栈上并传递可变引用,然后当我准备好使用闭包时,我可以使用它Option::take来获取闭包的所有权并使用它。
为了处理 的不同实现FnOnce,我可以将其提升为特征并使用特征对象:
trait Callable {
fn call(&mut self);
}
impl<F: FnOnce()> Callable for Option<F> {
fn call(&mut self) {
if let Some(func) = self.take() {
func();
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我可以传递位于堆栈上但可以通过引用来使用的特征对象。