【发布时间】:2015-11-01 07:02:20
【问题描述】:
我正在尝试创建一个回调系统,其中任何回调都可以包含在另一个回调中,以在调用它之前或之后修改它的行为。此代码有效:
type Closure = Box<Fn(&i32) -> i32>;
fn foo() {
let add_closure = |closure: Closure| {
let bar: Closure = Box::new(move |x| {
println!("{}", x);
closure(x)
});
};
add_closure(Box::new(|&x| x + 2));
}
fn main() {
foo()
}
但只要我在闭包中添加生命周期边界,它就不会:
type Closure<'a> = Box<Fn(&'a i32) -> i32>;
fn foo<'a>() {
let add_closure = |closure: Closure<'a>| {
let bar: Closure<'a> = Box::new(move |x| {
println!("{}", x);
closure(x)
});
};
add_closure(Box::new(|&x| x + 2));
}
fn main() {
foo()
}
我收到此错误:
./vec_closure.rs:5:32: 8:11 error: the type `[closure@./vec_closure.rs:5:41: 8:10 closure:Box<core::ops::Fn(&'a i32) -> i32 + 'static>]` does not fulfill the required lifetime [E0477]
./vec_closure.rs:5 let bar: Closure<'a> = Box::new(move |x| {
./vec_closure.rs:6 println!("{}", x);
./vec_closure.rs:7 closure(x)
./vec_closure.rs:8 });
note: type must outlive the static lifetime
error: aborting due to previous error
似乎添加生命周期限制会导致 Box 变为 'static,但我不明白为什么会这样或如何避免它。
【问题讨论】: