我试图声明一个const闭包,这样我就可以在整个代码中使用:
impl<T: Default + Copy + Eq> Profiler<T> {
pub const increase_by_one: dyn Fn(&T) = &|x| {
*x = *x + 1;
};
但我遇到了编译时未知大小的问题。
我也试过这个:
impl<T: Default + Copy + Eq> Profiler<T> {
pub const increase_by_one: fn(&T) = &|x| {
*x = *x + 1;
};
但它说x
的类型必须是已知的。
有没有一种方法可以在泛型结构中定义闭包?
现在不可能在Rust中定义const
闭包,因为无法命名闭包的类型。您可以使用函数指针(fn(&T)
(,但与闭包类型相比,这会导致调用时间开销。您可以使用'static
特征对象引用(&'static dyn Fn(&T)
(,但这也有调用时间开销,并且需要T: 'static
绑定。
幸运的是,const
闭包从来都不是必需的。闭包和fn
项之间的唯一区别是闭包可以有状态,但const
可能没有状态,所以将它们组合起来没有任何意义。只需使用关联函数而不是关联常量。
impl<T: AddAssign<i32>> Profiler<T> {
pub fn increase_by_one(x: &mut T) {
*x += 1;
}
}
另请参阅
- 在Rust中,什么是`fn((->((`
- 为什么向接受函数指针的函数传递闭包不起作用
- 为什么Rust允许通过空指针调用函数
- 为什么要设计一种具有独特匿名类型的语言