【发布时间】:2021-03-25 12:58:03
【问题描述】:
有没有办法使用 Rust 中的 trait 绑定来区分 move 闭包和非move 闭包?
对于上下文,我在我的程序中使用了盒装闭包(Box + dyn Fn trait),所以我需要担心生命周期,因为 IIUC 这些闭包可能会引用堆栈。
我想知道我是否可以只限于装箱的move-closures,以便(希望)我可以避免处理生命周期,因为在这种情况下这些很快就会变得混乱。
或者还有其他更好、更惯用的方法来达到同样的效果吗?
【问题讨论】:
-
盒装 trait 对象已经获得了默认的
'static绑定,来源:doc.rust-lang.org/reference/… -
更明确地说,特征绑定
Fn(...) + 'static指的是没有任何非静态外部引用的闭包。您不关心它们是否是使用move关键字创建的,或者它们是否通过任何其他方式避免了外部引用。正如@pretzelhammer 所指出的,对于Box<dyn Fn(...)>,静态生命周期限制是隐式的。如果您确实想允许非静态生命周期,则需要显式添加+ 'a绑定。 -
@SvenMarnach 谢谢,这正是我想要的。
标签: rust closures traits lifetime borrow-checker