【问题标题】:Lifetime of function reference in RustRust 中函数引用的生命周期
【发布时间】:2017-08-22 16:15:24
【问题描述】:

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

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

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

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

想法是只要EntityVisual组件,我们就可以使用这个回调来渲染它!

【问题讨论】:

  • 嗨,Kim,我将您的文本中对代码元素的引用更改为使用惯用的内联代码格式。我希望你能接受!

标签: rust lifetime


【解决方案1】:

一些事情:

  • 您使用了&amp;Fn() 而不是fn()。前者是Fn trait 的一个trait 对象,后者是一个很好的函数指针。虽然前者更通用(特别是它支持闭包),但存储对存在于其他地方的闭包的引用是相当不寻常的。
    • 因此,如果您还想存储闭包,您可能会使用 Box&lt;Fn()&gt; 来解决您的生命周期问题。
    • 如果你不关心闭包,只是想保存函数指针,你可以直接写Visual(fn(Entity)),。函数指针始终具有静态生命周期。因此,这也解决了您一生的问题。
    • 但是,如果您真的想存储对 Fn 特征对象的引用,该对象位于其他位置,该怎么办?解决方案取决于它的位置
    • Entity:见here
    • 别处:使用一生&lt;'a&gt;
  • 你写了Fn(Entity) -&gt; ()-&gt; () 总是无用的,你可以省略它。

【讨论】:

  • 我很肯定一个简单的函数指针会起作用,感谢您清除它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 2014-02-09
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多