生涯

2017-08-22 11 views
4

だから私はこの列挙バリアント(Visual)へのコールバックを中に絞るしようとしている - のstruct EntityComponents以内に見られるように、ベクターに格納されます。しかし生涯

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

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

、錆私は明示的な生涯パラメーターをここに提供する必要があります。 私の考えは、少なくとも関数の参照をその引数(Entity)と同じくらい長く生きたいと思っていますが、その構文がどのようになっているかわかりません。それも可能ですか?

EntityVisualコンポーネントがある限り、このコールバックを使用してレンダリングすることができます。

+0

こんにちはKim、私は慣習的なインラインコードの書式設定を使用するようにテキストのコード要素への参照を変更します。私はあなたがそれで大丈夫だと願っています! – Lii

答えて

4

いくつかのこと:

  • あなたは&Fn()代わりのfn()を使用。前者は形質のの形質オブジェクトであり、後者は良好な機能ポインタである。前者はより一般的ですが(特にクロージャをサポートしています)、別の場所にあるクロージャへの参照を保存することはむしろ珍しいことです。
    • したがって、クロージャも保存したい場合は、おそらくBox<Fn()>を使用して生涯の問題を解決してください。
    • クロージャを気にする必要はなく、単に関数ポインタを保存したい場合は、Visual(fn(Entity)),と書くだけです。関数ポインタは常に静的な存続期間を持ちます。これにより、生涯の問題も解決します。
    • しかし、Fn traitオブジェクトへの参照を実際に保存したい場合は、他の場所に存在しますか? Entity
    • を::他here
    • somehere参照:寿命を使用<'a>
  • をあなたはFn(Entity) ->()を書いた解決策は、それが住んでいるに依存します。 ->()は常に役に立たず、省略することができます。
+0

私は単純な関数ポインタが動作することを肯定的です、それをクリアするためのおかげで! – Kim

関連する問題