所以我试图在这个枚举变体(Visual
)中插入回调 - 它将存储在结构EntityComponents
中看到的向量中:
enum Component {
Position([f64; 2]),
Visual(& Fn(Entity) -> ()),
}
struct EntityComponents {
components_of_entity: HashMap<TypeId, Vec<Component>>,
}
但是,Rust要求我在这里提供显式的生命周期参数。
我的想法是,我希望函数引用至少与其参数(Entity
)一样长,但我不知道它的语法是什么样的?它甚至可能吗?
我们的想法是,只要Entity
有一个Visual
组件,我们就可以使用此回调来呈现它!
答案 0 :(得分:4)
一些事情:
&Fn()
代替fn()
。前者是Fn
特征的特征对象,后者是一个很好的特征。功能指针。虽然前者更为通用(特别是它支持闭包),但存储对生活在其他地方的闭包的引用是相当不寻常的。
Box<Fn()>
来解决您的生命问题。Visual(fn(Entity)),
。函数指针始终具有静态生命周期。所以这也解决了你的终身问题。Fn
特征对象的引用呢?解决方案取决于它所在的:Entity
:请参阅here <'a>
Fn(Entity) -> ()
。 -> ()
总是没用,你可以省略它。