首页 > 解决方案 > 是否可以使用 BoxFnOnce 来表达一个具有更高生命周期的可变引用的闭包?

问题描述

一个BoxedFnOnce目前在 Rust 中是不可调用的。作为一种解决方法,我正在使用boxfnonce板条箱,它试图模仿功能。

boxfnoncecrate 导出一个 struct BoxFnOnce<'a, (A, B...), R>,它的功能与它的工作方式相同Box<dyn FnOnce(A, B...) -> R + 'a>

问题是我希望我的盒装闭包的一个参数是一个可变引用,它的生命周期被省略了。如果我使用 boxed FnOnce,我可以简单地写:

type Foo<T> = Box<dyn FnOnce(&mut T)>;

这将被脱糖到更高级别的生命周期中

Box<dyn for<'a> FnOnce(&'a mut T)>

因为这些Fn特质是神奇的。问题是这BoxFnOnce既不是魔法,也不是特质,所以当我写

type Foo<T> = BoxFnOnce<(&mut T,)>;

Rust 想要我给这个引用一个生命周期。

编译器的建议是将生命周期参数添加到Foo

type Foo<'a, T> = BoxFnOnce<(&'a mut T,)>;

但这似乎不对,因为我们希望闭包可以在任何引用生命周期的选择上调用,而不是特定的。如果可能的话,我宁愿不必切换到夜间。

标签: rustclosureslifetime

解决方案


推荐阅读