首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在参数上创建带有闭包的回调函数,而不使用“可能超过借来的值”或“此闭包实现的是‘`FnOnce`’,而不是‘on’”

在参数上创建带有闭包的回调函数,而不使用“可能超过借来的值”或“此闭包实现的是‘`FnOnce`’,而不是‘on’”
EN

Stack Overflow用户
提问于 2020-11-27 17:41:20
回答 1查看 303关注 0票数 2

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

我试过使用有生之年,移动,Rc,弧,盒,RefCell,但似乎没有什么工作。

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

在我的实验中,我得到了以下错误:

Fn

  • 可能比借入值
  • 借入值更长,
  • 闭包是FnOnce,因为它移动了变量
  • 这个闭包实现了FnOnce,而不是

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-27 18:32:03

您没有提供编译器错误消息或实际的再现情况,因此很难知道仅仅考虑事物所完成的诊断是否正确,但在我看来,这将是解决方案:

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65041598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档