2017-08-22 60 views
4

所以我想以回調擠進這個枚舉變種(Visual) - 這將被存儲在一個向量作爲結構EntityComponents內看到:終身的防鏽功能參考

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

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

然而,拉斯特要求我在這裏提供明確的生命週期參數。 我的想法是,我希望函數引用至少和它的參數一樣長(Entity),但我不知道它的語法是怎麼樣的?它甚至有可能嗎?

想法是,只要Entity有一個Visual組件,我們就可以使用這個回調來渲染它!

+0

您好Kim,我更改您的文本中的代碼元素的引用,以使用習慣的內聯代碼格式。我希望你們沒事吧! – Lii

回答

4

有幾件事情:

  • 您使用&Fn()代替fn()。前者是Fn特徵的特徵對象,後者是一個很好的功能指針。雖然前者更普遍(特別是支持關閉),但存儲對其他地方的關閉的引用是很不尋常的。
    • 因此,如果你想存儲關閉,你可能會使用一個Box<Fn()>,它可以解決你的一生中的問題。
    • 如果你不關心關閉,但只是想保存函數指針,你可以簡單地寫Visual(fn(Entity)),。函數指針始終有一個靜態生命週期。所以這也解決了你的一生問題。
    • 但是,如果您真的想要存儲對某個Fn性狀對象的引用,該對象位於其他位置呢?該解決方案依賴於其中它生活:
    • Entity:看here
    • somehere其他:用一生的時間<'a>
  • 你寫Fn(Entity) ->()->()總是沒用,你可以省略它。
+0

我很積極,一個簡單的函數指針將工作,感謝清除它! – Kim