2016-09-07 8 views
0

このコードの有効期間パラメータはわかりません。私がしようと、すべて通常、コンパイラエラーになり:再帰的構造体エラーライフタイム(関数呼び出しで寿命パラメータの適切な有効期間を推論することはできません... [E0495])

consider using an explicit lifetime parameter as shown

または

in type &'ent Entity<'a, 'ent> , reference has a longer lifetime than the data it references.

Entityのようなもの、Referenceは、最小限のこの例を維持するためのバージョンを簡略化しています。

struct Entity<'a> { 
    id: i32, 
    name: &'a str, 
    references: Option<Vec<Reference<'a>>>, 
} 

struct Reference<'a> { 
    entity: &'a Entity<'a>, 
} 

fn main() { 
    let mut ents: Vec<Entity> = vec![Entity { 
             id: 0, 
             name: "Zero", 
             references: None, 
            }, 
            Entity { 
             id: 1, 
             name: "One", 
             references: None, 
            }, 
            Entity { 
             id: 2, 
             name: "Two", 
             references: None, 
            }, 
            Entity { 
             id: 3, 
             name: "Three", 
             references: None, 
            }]; 
    let references_ents_id = vec![vec![3, 1, 2], vec![1], vec![0, 3], vec![3, 0]]; 
    create_references(&references_ents_id, &mut ents); 
} 

fn create_references(refs_id: &Vec<Vec<i32>>, ents_vec: &mut Vec<Entity>) { 
    for (id_ent, references) in refs_id.iter().enumerate() { 
     let mut references_of_ent: Vec<Reference> = vec![]; 
     for id_ent in references { 
      references_of_ent.push(Reference { 
       entity: ents_vec.iter().find(|ent| ent.id == *id_ent).unwrap(), 
      }); 
     } 
     ents_vec[id_ent].references = Some(references_of_ent); 
    } 
} 

Rust Playground

答えて

0

私は間違った方向に見ていました。そして、私は解決策を見つけましたが、残念ながら安全ではありません。

  • このアプローチは、メモリ管理のコストを支払うが、あなたは、ノードの共有所有権を許可するようにRcWeakを使用してそれを実装することができます。
  • ローポインタを使用して安全でないコードを使用して実装できます。これはより効率的ですが、Rustの安全保証をバイパスします。
  • UnsafeCellで借用参照を使用する。

Rust FAQ

Other answer on SO

生ポインタと実装安全でないバージョンの例:

struct Entity<'a> { 
    id: i32, 
    name: &'a str, 
    references: Option<Vec<Reference<'a>>>, 
} 

struct Reference<'a> { 
    entity: *const Entity<'a>, 
} 

さび遊び場:https://play.rust-lang.org/?gist=8237d8cb80a681c981a85610104f2e5c&version=stable&backtrace=0