在没有 "may outlive borrowed value" 或 "this closure implements `FnOnce`, not `Fn`" 的情况下,在参数上创建带有闭包的回调函数

Creating callback function with closure on a parameter, without "may outlive borrowed value" or "this closure implements `FnOnce`, not `Fn`"

我想创建一个可以访问参数 instanceContext 的回调函数,但我不确定如何修复代码。 失败的代码是 instanceContext.instances.len().

我尝试过使用生命周期、移动、Rc、Arc、Box、RefCell,但似乎没有任何效果。

目标是拥有多个实例,这些实例将具有回调,使一个实例可以通过 InstanceContext call/modify 另一个实例。

在我的实验过程中,我遇到了以下错误:

use wasmtime::*;

struct InstanceContext {
    id: i32,
    instances: Vec<Instance>,
}

fn main() {
    let store = Store::new(&Engine::default());
    let mut instanceContext = InstanceContext { id: 5, instances: Vec::new() };
    let _callback = createCallback(&store, &mut instanceContext);
}

fn createCallback(store: &Store, instanceContext: &mut InstanceContext) -> wasmtime::Func {
    let f = Func::wrap(&store, || {
        println!("Number of instances: {}", instanceContext.instances.len());
    });
    f
}

您没有提供编译器错误消息或实际重现案例,因此很难知道仅通过思考获得的诊断是否正确,但对我来说,这似乎是解决方案:

fn main() {
    let store = Store::new(&Engine::default());
    let mut instanceContext = Rc::new(RefCell::new(InstanceContext { id: 5, instances: Vec::new() }));
    let _callback = createCallback(&store, instanceContext.clone());
}

fn createCallback(store: &Store, instanceContext: Rc<RefCell<InstanceContext>>) -> wasmtime::Func {
    let f = Func::wrap(&store, move || {
        println!("Number of instances: {}", instanceContext.borrow().instances.len());
    });
    f
}