我有这个不起作用的 Rust 代码片段:
use std::cmp::Ordering;
struct Sortable<T> {
buffer: Vec<T>,
compare: Box<dyn Fn(&T, &T) -> Ordering>,
}
impl<T> Sortable<T> {
fn new(compare_func: impl Fn(&T, &T) -> Ordering) -> Sortable<T> {
Sortable {
buffer: Vec::new(),
compare: Box::new(compare_func),
}
}
fn sort(&mut self) {
self.buffer.sort_by(&self.compare);
}
}
编译器抛出此错误:
the parameter type `impl Fn(&T, &T) -> Ordering` may not live long enough
我认为参数
compare_func
将从调用者移动到函数new
,然后移动到结构体字段compare
,因为函数声明中没有引用(&
)。但不知何故,这个错误是关于生命周期问题的。我在这里做错了什么,还是有一些解决方法可以做到这一点?
这可以通过要求闭包具有静态生命周期来解决。这反映了函数签名中结构体的生命周期要求。
use std::cmp::Ordering;
struct Sortable<T> {
buffer: Vec<T>,
compare: Box<dyn Fn(&T, &T) -> Ordering>,
}
impl<T> Sortable<T> {
fn new(compare_func: impl 'static + Fn(&T, &T) -> Ordering) -> Sortable<T> {
Sortable {
buffer: Vec::new(),
compare: Box::new(compare_func),
}
}
fn sort(&mut self) {
self.buffer.sort_by(&self.compare);
}
}