使用trait对象来存储闭包,并将其转换为具有相同生命周期的类型。
具体示例代码如下:
trait FnTrait {
fn call(&self);
}
impl FnTrait for F {
fn call(&self) {
self();
}
}
struct Closure {
f: Box
}
impl Closure {
fn new(f: F) -> Self {
Closure { f: Box::new(f) }
}
fn call(&self) {
self.f.call();
}
}
fn main() {
let x = 5;
let closure = Closure::new(|| println!("{}", x));
closure.call();
}
在这个例子中,我们创建了一个FnTrait
trait来定义能够被调用的闭包。然后我们可以将任何实现了Fn()
trait的闭包类型转换成FnTrait
trait对象类型。最后,我们创建一个Closure
结构体,它存储我们之前转换后的trait对象。这样,我们就可以在运行时调用存储的闭包。