如何在泛型结构中定义const闭包



我试图声明一个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允许通过空指针调用函数
  • 为什么要设计一种具有独特匿名类型的语言

最新更新