我可以创建一个指向堆栈对象的拥有指针

awe*_*kie 6 rust

我想将一个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)

据我所知,只要调度程序没有超过任务,这应该是安全的.有没有办法让这种情况发生?

awe*_*kie 0

我可以使用 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)

然后我可以传递位于堆栈上但可以通过引用来使用的特征对象。