【问题标题】:Creating callback function with closure on a parameter, without "may outlive borrowed value" or "this closure implements `FnOnce`, not `Fn`"在参数上创建带有闭包的回调函数,没有“可能超过借用值”或“此闭包实现 `FnOnce`,而不是 `Fn`”
【发布时间】:2021-03-10 11:42:38
【问题描述】:

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

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

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

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

  • 可能比借来的价值更长
  • 借用价值的寿命不够长
  • 闭包是FnOnce,因为它移动了变量
  • 这个闭包实现FnOnce,而不是Fn
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
}

【问题讨论】:

    标签: rust closures


    【解决方案1】:

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

    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
    }
    

    【讨论】:

    • 谢谢,这解决了我的问题!我很感激。我提供的代码是一个无法编译的 MWE,所以我不确定你的意思?您的反馈将很有用,因此我可以在将来发布更好的问题。
    • 黄金标准是在 play.rust-lang.org 上展示特定问题的东西
    • 我会记住这一点的。但是,那个特定的游乐场不支持 wasmtime 依赖,但也许我可以找到一个类似的游乐场,或者制作一个没有依赖的 MWE。谢谢!
    猜你喜欢
    • 2015-07-22
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2021-11-14
    • 1970-01-01
    相关资源
    最近更新 更多