Rust中函数引用的生命周期

时间:2017-08-22 16:15:24

标签: rust lifetime

所以我试图在这个枚举变体(Visual)中插入回调 - 它将存储在结构EntityComponents中看到的向量中:

enum Component {
    Position([f64; 2]),
    Visual(& Fn(Entity) -> ()),
}

struct EntityComponents {
    components_of_entity: HashMap<TypeId, Vec<Component>>,
}

但是,Rust要求我在这里提供显式的生命周期参数。 我的想法是,我希望函数引用至少与其参数(Entity)一样长,但我不知道它的语法是什么样的?它甚至可能吗?

我们的想法是,只要Entity有一个Visual组件,我们就可以使用此回调来呈现它!

1 个答案:

答案 0 :(得分:4)

一些事情:

  • 您使用&Fn()代替fn()。前者是Fn特征的特征对象,后者是一个很好的特征。功能指针。虽然前者更为通用(特别是它支持闭包),但存储对生活在其他地方的闭包的引用是相当不寻常的。
    • 因此,如果您想要存储闭包,您可能会使用Box<Fn()>来解决您的生命问题。
    • 如果你不关心闭包,只想保存函数指针,你可以简单地写Visual(fn(Entity)),。函数指针始终具有静态生命周期。所以这也解决了你的终身问题。
    • 但是如果你真的想要存储一个生成在其他地方的Fn特征对象的引用呢?解决方案取决于它所在的
    • Entity :请参阅here
    • 其他地方:使用生命周期<'a>
  • 你写了Fn(Entity) -> ()-> ()总是没用,你可以省略它。