在没有 "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 另一个实例。
在我的实验过程中,我遇到了以下错误:
- 可能比借来的价值还长
- 借来的价值不够长
- 闭包是
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
}
我想创建一个可以访问参数 instanceContext
的回调函数,但我不确定如何修复代码。
失败的代码是 instanceContext.instances.len()
.
我尝试过使用生命周期、移动、Rc、Arc、Box、RefCell,但似乎没有任何效果。
目标是拥有多个实例,这些实例将具有回调,使一个实例可以通过 InstanceContext call/modify 另一个实例。
在我的实验过程中,我遇到了以下错误:
- 可能比借来的价值还长
- 借来的价值不够长
- 闭包是
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
}