2016-03-24 14 views
4

錆はこのような最適な言語のようです - 私はコンパイラとの戦いが価格になるはずだったはずです。構造体のコンストラクタを作成しようとしていますが、does not live long enoughというエラーが発生しています。骨のbarestに蒸留参照ベクトルを使用して構造体を作成するにはどうすればよいですか?

、私が持っている:そのベクトルlistが特色オブジェクトのリストを保持することになっているので、

fn main() { 
    println!("RUST PLEASE"); 
} 

struct Help<'a> { 
    list: Vec<&'a Traits> 
} 

impl<'a> Help<'a> { 
    fn new() -> Help<'a> { 
     Help { list: vec![&Test] } 
    } 
} 

trait Traits { 
    fn mice(&self); 
} 

struct Test; 
impl Traits for Test { 
    fn mice(&self) { print!("WHY"); } 
} 

だから、私はこれをやっています。それは(おそらく)与えられた形質を実装するクラスを不均一に保持する。私が理解しているように、それは参照を使ってベクターが実際のサイズになるようにしなければならないということです。それは参考になるので、一緒に住んで死ぬことを確実にするために生涯はそこになければなりません。

事は、間違っていることが分かります。 newでは、そのTestnewスコープに属しています。その参照を機能の上に出し入れしようとしています。私がそうするなら、Testは範囲外になり、参照は悪いです。では私は何をしますか?どのように私はHelpの生涯続くオブジェクトを得ることができますか?結局のところ、それを所有する人は本当にありません。

また、誰かが一般的な関数から参照を戻す方法について一般的なヒントがあれば、私はそれらを聞いて非常にうれしいです。

EDITこれは、単にオブジェクトの所有権を渡すのと同じではありません。ベクトルは、スタック上のオブジェクトではなく参照であるが必要なので、私はそれを行うことができません。サイモンの答えはおそらく私が探しているものです - 私はそれのようなものを箱に入れることができたことを忘れていました。

+0

[拡大さび寿命(http://stackoverflow.com/questions/31252851/expanding-rust-lifetime)の可能性の重複 –

答えて

3

あなたは、おそらく実際に参照を返すようにしたくない...しかし、あなたの代わりにそれらをボックスと彼らは箱入りの値を所有するかもしれない:

fn main() { 
    println!("RUST PLEASE"); 
} 

struct Help { 
    list: Vec<Box<Traits>> 
} 

impl Help { 
    fn new() -> Help { 
     Help { list: vec![Box::new(Test)] } 
    } 
} 

trait Traits { 
    fn mice(&self); 
} 

struct Test; 
impl Traits for Test { 
    fn mice(&self) { print!("WHY"); } 
} 

あなたHelp構造体は、その箱入り値のベクトルを所有していますそれからあなたは前方への参照をすることができます。

Playpen link

関連する問題