Rust中函数引用的生命周期

4

我正在尝试将回调函数插入到此枚举变量(Visual)中 - 它将作为结构体 EntityComponents 中的向量存储,如下所示:

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

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

然而,在这里Rust要求我提供明确的生命周期参数。我的想法是,我希望函数引用至少与其参数(Entity)具有相同的生命周期,但我不知道语法会是什么样子?这是否可能?
这个想法是,只要一个Entity有一个Visual组件,我们就可以使用这个回调函数来呈现它!

嗨,金姆,我更改了您文本中对代码元素的引用方式,使用通常的内联代码格式。希望您对此没有意见! - Lii
1个回答

4
一些事情:
- 你使用了 &Fn() 而不是 fn()。前者是 Fn 特质的 trait 对象,而后者是一个普通的函数指针。虽然前者更加通用(特别是它支持闭包),但是存储一个生存在其他地方的闭包的引用相当不寻常。
- 因此,如果你想要存储闭包,你可能会使用一个 Box<Fn()> 来解决生命周期问题。
- 如果你不关心闭包,只想保存函数指针,你可以简单地写成 Visual(fn(Entity)),。函数指针总是具有静态生命周期。因此,这也解决了你的生命周期问题。
- 但是如果你真的想要存储一个生存在其他地方的 Fn 特质对象的引用呢?解决方案取决于它在哪里:
- 在 Entity 中:参见 这里 - 在其他地方:使用生命周期 <'a> - 你写成了 Fn(Entity) -> ()。其中的 -> () 总是无用的,你可以省略它。

我相信一个简单的函数指针就可以解决问题,感谢你的澄清! - Kim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接