gpt4 book ai didi

rust - 创建带参数闭包的回调函数,不包含 “may outlive borrowed value”或 “this closure implements ` FnOnce`,而不是 `Fn`”

转载 作者:行者123 更新时间:2023-12-03 11:36:39 29 4
gpt4 key购买 nike

我想创建一个可以访问参数instanceContext的回调函数,但是我不确定如何修复该代码。
失败的代码是instanceContext.instances.len()
我已经尝试过使用生命周期,移动,Rc,Arc,框,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
    }

    最佳答案

    您没有提供编译器错误消息或实际的复制情况,因此很难知道仅通过思考问题而得出的诊断是否正确,但对我而言,这似乎是解决方案:

    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
    }

    关于rust - 创建带参数闭包的回调函数,不包含 “may outlive borrowed value”或 “this closure implements ` FnOnce`,而不是 `Fn`”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65041598/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com